ios语法
layout: post title: “2019-11-07- ios语法.markdown” date: 2019-11-07 12:11:30 +0800
-
闭包/匿名内部类的演化 func say1(_ s:String) -> Void { print(s) } func say2(_ s:String) -> () { print(s) } func say3(_ s:String) { print(s) }
-
带上in { () -> () in self.myButton.frame.origin.y += 20 } { (finished:Bool) -> () in print(“finished: (finished)”) }
let image = imageOfSize(CGSize(width:45, height:20), { () -> () in let p = UIBezierPath( roundedRect: CGRect(x:0, y:0, width:45, height:20), cornerRadius: 8) p.stroke() })
UIView.animate(withDuration:0.4, animations: { self.myButton.frame.origin.y += 20 }, completion: { (finished:Bool) in print(“finished: (finished)”) })
UIView.animate(withDuration:0.4, animations: { self.myButton.frame.origin.y += 20 }, completion: { (finished) in print(“finished: (finished)”) })
UIView.animate(withDuration:0.4, animations: { self.myButton.frame.origin.y += 20 }, completion: { finished in print(“finished: (finished)”) })
UIView.animate(withDuration:0.4, animations: { self.myButton.frame.origin.y += 20 }, completion: { print(“finished: ($0)”) })
UIView.animate(withDuration:0.4, animations: { self.myButton.frame.origin.y += 20 }, completion: { _ in print(“finished!”) })
let arr = [2, 4, 6, 8] let arr2 = arr.map ({ (i:Int) -> Int in return i*2 })
-
[weak self] 将 func method2() { //解决方式二: 在swift中 有特殊的写法 [weak self] loadData { [weak self] (dataString) -> () in
//以后在闭包中中 使用self 都是若引用的 print("\(dataString) \(self?.view)") } }
- @escaping逃逸闭包 非逃逸闭包的生命周期与函数相同; 即逃逸闭包的生命周期长于函数,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放;
- guard guard可以把不符合条件的处理事件前置,以免程序猿在开发中有遗漏的情况出现。 guard还可以减少条件语句中的嵌套数量,使代码更简洁易读。
Swift规定,guard - else必须同时出现,而且,else中,必须进行return。 这就保证了我们不会漏掉return,同时,guard条件本身也是正相关:如果条件成立则执行下一步。 这符合我们的思维习惯,相比之下, if ! 则需要我们对条件进行一个非转换,和我们的思维习惯不合。这里体现了guard - else的优势。
- class func 表示静态方法,同static func Swift中static func 相当于class final func。禁止这个方法被重写。
-
单例模式 class func shareInstance() -> IFLAppDelegateHelper? { if let _ = instance {
} else { objc_sync_enter(self) if let _ = instance { } else { instance = IFLAppDelegateHelper() } objc_sync_exit(self) } return instance }
- $0指第一个入参 plugins.forEach { $0.didReceive(result, target: target) }
- switch case的高级用法
- 可以判断一个范围
- 可以使用元组 case(0,1)
- 可以忽略元组中的一个元素(_,1)
- 可以进行value binding case (let x, 0): https://www.cnblogs.com/dhui69/p/11196604.html
- where语句
https://blog.csdn.net/brycegao321/article/details/78683676
-
some函数
-
以闭包的形式返回值 var path: String { switch self { case .login: return “/usercenter/i/signin” case .getNews: return “/product-center/v1/product/app/list” } }
-
带可选项的字符串的拼接 let name = “王红庆” let age = 18 let title: String? = “iOS开发大菜逼”
// 下面这样写会报警告:String interpolation produces a debug description for an optional value; did you mean to make this explicit? let str = “(name)(age)(title)” /**
- 解决’警告’和输出’Optional’的办法
- 1.对’title’强行解包(这里不推荐不推荐)—>(title!)
- 2.使用’??’————————–>(title ?? “”) */ let str = “(name)(age)(title!)” // 输出:王红庆18iOS开发大菜逼 let str = “(name)(age)(title ?? “”)” // 输出:王红庆18iOS开发大菜逼 print(str) // 输出:王红庆18Optional(“iOS开发大菜逼”)
-
类名,字符串声明 fileprivate func nibName() -> String { return String(describing: type(of: self)) }
-
if let 解包,省略为空判断 if let aProp = self.prop{ …其他更多的操作 } // 强制类型转换 if let typeAObj = typeBObj as? typeA{ // 如果能够转换成功,那么typeAObj就是强转后的对象 …. }else { // 转化失败,这里一般不会做处理 }
-
if case .xx= xxx 简化switch case,适用于判断单个case类型 let myBrand = CarBrand.BMW if case .BMW = myBrand{ print(“宝马”) } // if case let let myCar = CarBrand.BMW(name: “宝马”,Production: “德国”) switch myCar { case let CarBrand.BMW(name, Production): print(“This car named (name),from(Production)”) default: () // 不做任何处理 } 简化为: let myBrand = CarBrand.BMW(name: “宝马”,Production: “德国”) if case let CarBrand.BMW(name, Production) = myBrand{ print(“(name),(Production)”) }
参考: https://www.jianshu.com/p/42c09c4bf6de https://medium.com/anysuggestion/preventing-memory-leaks-with-swift-compile-time-safety-49b845df4dc6 https://blog.csdn.net/qq_30932479/article/details/80517518 https://www.jianshu.com/p/3f9af8946b61
https://www.jianshu.com/p/3a9fbeef56a1?utm_source=oschina-app