1. “Implicitly Unwrapped” Optional
在许多类或者结构体中,有些属性的值随着实例化即可确定下来不为空,那么这种情况下再做判断或者解析就显得繁冗且低效,做了好多不必要的工作,就像下面这个例子。
class User { var id: String? var name: String? var age: Int? init() { id = "defaultId" } func login() { self.id = "abcdefg" self.name = "Bob" self.age = 13 }}let Bob = User()Bob.login()if Bob.id != nil { print("id: \(Bob.id!)")}
在上述例子中,就像用户的id号,每次新注册一个用户或者登陆一个用户,他的id肯定是存在的,如果这时候再判断id是否为nil,显然是不必要的。这时候就需要将属性类型后面的?
改为!
。
其实无论类型是用!
还是用?
声明的,类型都是作为Optional的存在,但是!
被称作隐式解析可选类型,意味着你想获取其值不必解析,可以直接拿来用,但是呢,也不代表它不为nil。
2. collection使用字面量进行初始化
var arr: [String] = []var dic: [String: Int] = []var set: Set<String> = []
3. url中汉字encode
let urlStr = "http://faichou.com?name=周辉"let urlStrEncode = urlStr.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)print(urlStrEncode) // http://faichou.com?name=%E5%91...
4. #line #file #function

#line
#function
#file
在Swift中相当于Objective-C中的__LINE__
__FUNCTION__
__FILE__
。
5. guard let 和 if let
func foo() { let someStr: String = "" guard let str = someStr, str != "" else { return } print("str is not empty!")}func bar() { if let url = URL(string: urlString), url.pathExtension == "png", let data = try? Data(contentsOf: url), let image = UIImage(data: data) { let view = UIImageView(image: image) // .. }}
6. 高阶函数
let arr = [1, 3, 2, 4] // 求let res = arr.filter { $0%2 == 0 } // 数组中偶数的 .map { $0*$0 } // 平方 .reduce { 0, + } // 和
7. singleton
class Singleton { static let sharedInstance = Singleton() private init() {}}
8. 闭包中使用self
User.autologin(phone, password) { [weak self] (status) in guard let strongSelf = self else { return } DispatchQueue.main.async { if status == true { strongSelf.pushTo(.home) } else { strongSelf.pushTo(.login) } }}