swift - 相等运算符是否意味着强制展开?

标签 swift forced-unwrapping

注意最后两行:

var optionalString: String? // nil
optionalString == "A"       // false
//optionalString! == "A"    // EXC_BAD_INSTRUCTION
optionalString = "A"        // “A”
optionalString == "A"       // true
optionalString! == "A"      // true

这是否意味着我们在比较时不需要解开可选值?

最佳答案

这是 == 运算符的定义,看起来在本例中使用了它:

public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

您看到第一个参数 (lhs) 和第二个参数 (rhs) 必须具有相同的类型,T?。由于第一个参数 (optionalString) 是 String?,我认为第二个参数也被转换为 String?,这使得比较有效。

我认为这证明了这个想法:

func testCasting<T: Equatable>(a: T?, b: T?) {
    print(a, b) // Optional("A") Optional("A")
}

var optionalString: String? = "A"
testCasting(optionalString, b: "A")

在第二个参数中,您传递一个文字 A ,该文字被包装在一个可选值中以进行类型检查。代码编译并运行。

请注意,这与隐式展开第一个参数完全不同。这不是一个安全的操作,并且会破坏选项的全部意义。

关于swift - 相等运算符是否意味着强制展开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33774965/

相关文章:

ios - SKaction 阻止了 touchesBegan 事件

swift - 无法在 Ubuntu 中安装 Swift

ios - 为什么我不能以这种方式在我的 [( String, [ProtocolType] )] 中插入一个 (String, [ProtocolConformer]) 元组?

iOS 12 音乐应用的锁屏控制

ios - 在 Swift 中将 UIScrollView 与 UIVisualEffectView (UIBlurEffect) 结合使用

ios - 有没有办法抵消 tableview 动画,这样它们就不会一次全部显示出来?

Swift:Force Unwrapped 返回 nil 而不会崩溃

swift - 需要帮助理解便捷初始化器和 Swift 中实例变量解包之间的交互

ios - 如何在 Swift 3 中解包一个模态类对象