《函数式swift》—swift为什么是用可选值?

Posted iOS开发知识整理

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《函数式swift》—swift为什么是用可选值?相关的知识,希望对你有一定的参考价值。

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 内代码并不会执行

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


以上是关于《函数式swift》—swift为什么是用可选值?的主要内容,如果未能解决你的问题,请参考以下文章

Swift函数式编程四(可选值)

Swift:错误:在隐式展开可选值时意外发现 nil

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

在隐式展开可选值 AVAUDIO Player SWIFT 时意外发现 nil

Swift:XCTest 会修改状态吗?可以返回可选值的测试函数的约定是啥?

Swift:在展开可选值时发现映射函数为零