这篇文章来记录下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)
〜
〜
〜
〜
〜
网友评论