我理解,在Swift中,所有变量都必须设置一个值,通过使用选项,我们可以将一个变量设置为nil.

我不明白的是,将一个变量设置为!意味着什么,因为我的印象是,这会从一个可选变量"展开"一个值.我认为这样做,可以保证变量中有一个要展开的值,这就是为什么在IBActions上使用它.

简单地说,当你这样做时,初始化变量是什么:

var aShape : CAShapeLayer!

我为什么/什么时候会这样做?

推荐答案

在类型声明中,!?类似.两者都是可选的,但!是"implicitly unwrapped" optional",这意味着您不必展开它来访问值(但它仍然可以为零).

这基本上是我们在objective-c中已有的行为.值can为零,您必须判断它,但您也可以直接访问该值,就像它不是可选的一样(重要的区别是,如果不判断零,您将得到运行时错误)

// Cannot be nil
var x: Int = 1

// The type here is not "Int", it's "Optional Int"
var y: Int? = 2

// The type here is "Implicitly Unwrapped Optional Int"
var z: Int! = 3

用法:

// you can add x and z
x + z == 4

// ...but not x and y, because y needs to be unwrapped
x + y // error

// to add x and y you need to do:
x + y!

// but you *should* do this:
if let y_val = y {
    x + y_val
}

Swift相关问答推荐

什么是Swift Concurrency中任务组的正常退出

日期格式yyyyyy—MM—dd hh:mm:ss +0000到dd MMM,以swift格式表示""""

OBJC代码中Swift 演员的伊瓦尔:原子还是非原子?

UIImage和UIimage.pngData返回两个不同的图像

Swift:结果的失败类型不能是协议 - Type 'any ShadowError' cannot conform to Error

带有可选字符串作为键路径的 SwiftUI iOS16 表

自定义碰撞形状出现在错误的位置

如何在 SwiftUI 中创建条件内容?

在PrimitiveSequence上引用实例方法xxx需要类型A和any B等效

在 Swift 的异步上下文中,如何指示我想要函数的同步版本?

如何为等待函数调用添加超时

如何更新 UserDefault 中的特定值

在 Select 器上显示alert Select SwiftUI

`@available` 属性在 macOS 版本上被错误地限制

找不到目标AAA的 SPM 工件 - 仅限 Xcode 13.3

Swift - 导入我的 swift 类

如何从 UITableViewCell 类中引用 UITableViewController?

在 Swiftui 中是否有一种简单的方法可以通过捏合来放大图像?

在 Swift 中从服务器播放视频文件

iOS:如何检测用户是否订阅了自动更新订阅