《函数式swift》学习二

114 阅读1分钟

swift为什么是用可选值?

  • 在Object-C中我们可以将nil作为一个参数传递给函数,但是这有个弊端,一个是空指针的访问,二是Object-C区分字典查询(键不存在于字典)和成功返回nil的字典查询(键存在于字典,但关联值是nil),只能使用NSNull来判断。
  • 在Object-C中将消息发送给nil是安全的,但是使用他们往往并不安全。

这段oc的代码。rangeOfString: 将返回一个属性全为0的结构体,location将返回0,然后if内的代码被执行。这实际上是和我们期望的相违背的。

    NSString * str = nil;
    if([str rangeOfString:@"swift"].location != NSNotFound){
        NSLog(@"some print");
    }

但是如果这个例子在swift里面的话,就可以完全被避免,上面的代码会被编译器拒绝,类型系统也不会允许你在一个nil值上运行rangeOfString:。

var someString:NSString?
if let str = someString, str.range(of: "ddd").location != NSNotFound {
    print("some thing")
}
//if 内代码并不会执行

类型系统将有助于你捕捉难以察觉的细微错误,其中一些错误很容易在开发过程中被发现,但是其余的可能会一直留在生产代码中去。坚持使用可选值能够从根本上杜绝这类错误。