Swift中 !和 ?的区别及使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift中 !和 ?的区别及使用相关的知识,希望对你有一定的参考价值。

参考技术A

相信大家在学习和使用Swift的时候,肯定会被 ! 和 ? 搞疯过, 纠结这两个符号到底是个什么鬼 ?鬼知道什么时候使用 ! ,什么时候使用 ?

下面就说一下 ! 和 ? 区别以及该怎么使用!

? 和 ! 其实分别是Swift语言中对一种可选类型( Optional) 操作的语法糖。
那可选类型是干什么的呢? Swift中是可以声明一个没有初始值的属性, Swift中引入了可选类型(Optional)来解决这一问题。它的定义是通过在类型声明后加一个 ? 操作符完成的。
例如: var name: String?
Optional 其实是个 enum ,里面有 None 和 Some 两种类型。其实所谓的nil就是 Optional.None , 非nil就是 Optional.Some , 然后会通过 Some(T) 包装(wrap)原始值,这也是为什么在使用 Optional 的时候要拆包(从 enum 里取出来原始值)的原因。这里是enum Optional的定义

既然这样, 那对于 var name: String? 该怎样去理解这句语法呢?

一旦声明为 Optional 的,如果不显式的赋值就会有个默认值 nil 。判断一个 Optional 的值是否有值,可以用if来判断:

怎么使用 Optional 值呢?文档中也有提到说,在使用 Optional 值的时候需要在具体的操作,比如调用方法、属性、下标索引等前面需要加上一个 ? ,如果是 nil 值,也就是 Optional.None ,会跳过后面的操作不执行,如果有值,就是 Optional.Some ,可能就会拆包(unwrap),然后对拆包后的值执行后面的操作,来保证执行这个操作的安全性。

? 的使用场景:
1.声明 Optional 值变量
2.用在对 Optional 值操作中,用来判断是否能响应后面的操作
3.使用 as? 向下转型(Downcast)

上面提到 Optional 值需要拆包(unwrap)后才能得到原来值,然后才能对其操作,那怎么来拆包呢?
拆包有两种方法:

其实, 还有一种叫隐式拆包(Implicitly Unwrapped Optionals),比如 对于会在viewDidLoad进行初始化的变量,可以直接定义为 var str :String! 等于说你每次对这种类型的值操作时,都会自动在操作前补上一个 ! 进行拆包,然后在执行后面的操作,当然如果该值是nil,会报错crash掉。
举个很浅显的栗子:

! 的使用场景:
1.强制对 Optional 值进行拆包(unwrap)
2.声明隐式拆包变量,一般用于类中的属性

其实 ! 和 ? 的问题是很坑的,不要看它仅仅是两个符号,因为只要有一个不小心,不注意,你会发现项目运行起来,会莫名的crash掉了,关键是Debug模式也不是很方便定位错误类型。 自己整理一下关于 可选类型的相关使用,一是记录和巩固所学,而是希望会对大家有所帮助。 本文可能会有错误和不妥之处,还望提出,我会及时改正。

swift中UIWebView(已弃用)和webkit View之间的区别

【中文标题】swift中UIWebView(已弃用)和webkit View之间的区别【英文标题】:Difference between UIWebView(deprecated) and webkit View in swift 【发布时间】:2019-04-25 04:57:49 【问题描述】:

我开始在 ios swift 中学习 webview,但我无法理解 uiwebview 和 webview 套件之间的区别。推荐一些文章或文档,以便我说清楚。

【问题讨论】:

简单 - UIWebView 已过时。使用 WKWebView。您还在寻找哪些其他信息在这两个类的参考文档中没有看到? 【参考方案1】:

UIWebView 已弃用,不应在应用程序中使用,WKWebView 是它的替代品。

如果你比较它的性能,WKWebView 在内存消耗的情况下优于UIWebView,因为UIWebView 会消耗大量内存来加载相同的网页,而另一方面WKWebView 不会消耗那么多。您可以轻松创建演示应用并亲自查看

根据 Apple 文档

在 iOS 8 及更高版本中运行的应用程序中,请改用 WKWebView 类 使用 UIWebView

所以,总结一下,如果你想在你的应用中加载一个网页,你可以使用WKWebView

另外,不是您真正想要的,但如果您想要一些 Safari 相关的功能,例如阅读器、自动填充、欺诈性网站检测和内容阻止,您还应该查看 SFSafariViewController

您可以找到更多关于SFSafariViewController的信息

【讨论】:

以上是关于Swift中 !和 ?的区别及使用的主要内容,如果未能解决你的问题,请参考以下文章

Swift 5 中切换案例“@unknown default”和“default”之间的区别

swift中CBUUID和NSUUID的区别

Swift 4 中的私有和文件私有有啥区别

swift中的protocol和OC中protocol的区别

swift 3中Passkit和Applepay之间的区别?

swift里nsdictionary和dictionary有啥区别