Swift实用Tips

作者: 皮皮蟹pipixie | 来源:发表于2019-06-11 23:01 被阅读46次

这篇文章来记录下Swift开发get到的点,虽然简单,但很实用。

1.扩展UserDefaults加属性,使用get set 来存取数据。
//声明属性
extension UserDefaults {
    var someData: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }
}

//使用
UserDefaults.standard.someData = true
print("someData == \(UserDefaults.standard.someData)")
2.使用闭包来写数组排序。
let array = [3, 9, 1, 4, 6, 2]
let sorted = array.sorted(by: <)
3.判断层数很多时,使用guard来退出,或使用if时退出,减少if else 层数。
//使用前,层次多的很
func test(a: Bool, b: Bool, c: Bool) {
    if a {
        if b {
            if c {
                print("a == true, b == true, c == true")
            }else {
                print("c == false")
            }
        }else {
            print("b == false")
        }
    }else {
        print("a == false")
    }
}

//使用后,逻辑清晰,代码复杂时,优势更加明显
func test(a: Bool, b: Bool, c: Bool) {
    if !a {
        print("a == false")
        return
    }
    if !b {
        print("b == false")
        return
    }
    guard c else {
        print("c == false")
        return
    }
    print("a == true, b == true, c == true")
}
4.==与===

==是比较两个变量值是否相等。
===是比较两个对象是否为同一对象(内存地址一样)。

5.在闭包中使用 [weak self],防止循环引用。
//只是举个例子,这里其实并不会产生循环引用
DispatchQueue.main.async { [weak self] in
  guard let weakSelf = self else {
    return
  }
  //self.doSomething
}
6.懒加载,加快启动速度的好东西。
lazy var button = setupButton()

func setupButton() -> UIButton {
    let btn = UIButton.init(type: .custom)
    btn.frame = CGRect.init(x: 100, y: 100, width: 100, height: 100)
    btn.backgroundColor = UIColor.orange
    return btn
}
7.使用zip函数,可以轻松地组合两个序列,zip会负责所有的边界检查。
for (label, text) in zip(titleLabels, titles) {
    print(text)
    label.text = text
}
8.static与class的区别,class可以被子类覆盖(但是,不能存储它们,只能计算)。
9.swift数组获取index。
let person1 = Person(name: "John")
let person2 = Person(name: "Sue")
let person3 = Person(name: "Maria")
let person4 = Person(name: "Loner")
let people = [person1, person2, person3]

let indexOfPerson1 = people.index{$0 === person1} // 0
let indexOfPerson2 = people.index{$0 === person2} // 1
let indexOfPerson3 = people.index{$0 === person3} // 2
let indexOfPerson4 = people.index{$0 === person4} // nil
10.获取当前显示最上层的ViewController。
static func  getVisibleViewController() -> UIViewController? {
    
    guard let rootVC = UIApplication.shared.keyWindow?.rootViewController, rootVC.children.count>0, let navigationVC = rootVC.children[0] as? UINavigationController  else {
        return nil
    }
    let currentVC = navigationVC.visibleViewController
    guard let index = currentVC?.tabBarController?.selectedIndex, rootVC.children.count>index+1, let currentNav = rootVC.children[index] as? UINavigationController  else {
        return nil
    }
    return currentNav.visibleViewController
}
11.寻找第一响应者。
extension UIView {
    
    func getCurrentFirstResponder() -> UIView? {
        
        for subView: UIView in self.subviews as [UIView] {
            if subView.isFirstResponder {
                return subView
            } else {
                if let sub = subView.getCurrentFirstResponder() {
                    return sub;
                }
            }
        }
        return nil
    }
}
12.遍历数组时,同时得到下标和元素。
for (index,element) in list.enumerate() {
}
13.根据类名获取控制器。
// 1. 获取去命名空间,由于项目肯定有info.plist文件所有可以机型强制解包.
guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
    print("没有获取到命名空间")
    return
}
// 2. 根据类名获取对应的类
let className = "TestViewController"
guard let childVcClass = NSClassFromString("\(nameSpace).\(className)") else {
    print("没有获取到对应的类")
    return
}
// 3. 将AnyObject转换成控制器类型
guard let childVcType = childVcClass as? UIViewController.Type else {
    print("没有转换成控制器类型")
    return
}
// 4. 创建控制器实例
let childVc = childVcType.init()
// 5. 添加控制器
childVc.title = className
navigationController?.pushViewController(childVc, animated: true)





未完持续

相关文章

网友评论

    本文标题:Swift实用Tips

    本文链接:https://www.haomeiwen.com/subject/jbwcfctx.html