我无法理解显式声明的字符串和隐式解包的可选字符串之间的区别。
例如,
如果我们显式地初始化一个字符串,
let assumedString:String = "Test String"
print(assumedString)
给出输出
"Test String"
"Test String\n"
在 Playground 上。
同样,如果我们像这样隐式解包一个可选字符串,
let assumedString:String! = "Test String"
print(assumedString)
给出相同的输出
"Test String"
"Test String\n"
还有一次我们使用 '!'在初始化时,它的值不能为零。那么我们可以使用显式类型吗?
那我们为什么要用'!'这个概念呢? (隐式展开可选字符串)。
请解释使用“!”的区别或用法如果可能,请提供代码示例。
最佳答案
在您的示例中,您仅使用了 let
常量。使用 let
常量,您几乎看不出两者之间的区别。情况发生了变化。
如您所知,类中的所有属性都必须在初始化程序中初始化为某个值。可选属性是此规则的一个异常(exception)。默认情况下,nil
即没有值。
我最常使用隐式展开的可选值是在我有一个存储 View 高度或任何与 UI 相关的属性时。我总是将它们声明为隐式展开的可选值。例如
var myViewsHeight: CGFloat!
override func viewDidLoad() {
myViewsHeight = self.view.viewWithTag(1).frame.height
}
您显然不能在 init
中初始化该变量,因为在 init
中, View 尚未布局!无法知道 View 的高度。您将其设为隐式展开的可选项,因为您知道它将在viewDidLoad
中进行初始化。这样做的另一个好处是它使跟踪错误更容易。假设您的应用程序崩溃是因为如果 viewDidLoad
中发生了某些事情并且未执行初始化 myViewsHeight
的行,您将立即知道因为您的应用程序崩溃了!
您还会看到所有 IBOutlet
都是隐式展开的可选值,出于同样的原因 - 不能在 init
分配 View 。
关于ios - 隐式展开的可选字符串的确切用途是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543311/