ios - 隐式展开的可选字符串的确切用途是什么

标签 ios swift forced-unwrapping

我无法理解显式声明的字符串和隐式解包的可选字符串之间的区别。

例如,

如果我们显式地初始化一个字符串,

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/

相关文章:

ios - iPhone 6 和 6 plus 给出错误的帧、边界值

ios - 滚动时表格 View 不响应触摸

使用 WKWebView 上传 HTML 文件 "Could not create a sandbox extension"

ios - 带有 NSFetchedResultsController 的 UITableView 不会第二次加载

swift - 使用 Swift 函数,该函数采用通用序列

ios - 加入具有不同最终定界符的字符串数组

ios - 不在 guard 语句中使用展开

ios - 从 Parse.com 获取数据到自定义单元格(swift)

ios - nil 合并运算符 '??' 的左侧具有非可选类型 'String' ,因此从不使用右侧