Swift 选项与 Ruby ||=

Swift Optionals vs. Ruby ||=

我正在从学习 Ruby 过渡到 Swift 并尝试建立任何有用的关联,以便更好地理解两种编程语言的相似概念。我注意到在 Swift 中有一些可选项,它们要么具有或不具有分配给变量的值。

var optinalString: String? = "This is optional"

在 Ruby 中,我们有 ||=,据我所知,它做了一些非常相似的事情,如果用户没有给这个变量赋值,那么它将使用已经存在的预定义值已设置。

optionalString ||= "This is optional"

我的假设是否正确?总体而言,是什么造就了这些概念 similar/different?

这两个概念并不等同。

在您的 Swift 示例中,您正在创建一个类型为 String? 的变量并为其分配字符串文字的值。在 Ruby 示例中,如果 optionalString 未定义、为零或求值为假 (more info).[=29=,则将字符串文字分配给 optionalString 变量]

在Swift中,当你创建一个可选类型的变量时,你所做的只是指定该变量允许为nil,所以更接近您的 Ruby 示例的表示可能如下所示:

var optionalString: String?
optionalString = optionalString ?? "This is optional"

它使用 Swift 的 nil coalescing operator 并且等效于三元条件运算符的以下用法,其中 optionalString 被分配 optionalString 的展开值,如果它不是零,如果不是,则为 "This is optional" 的后备值。

optionalString = optionalString != nil ? optionalString! : "This is optional"

请注意,通过这样做,您的变量仍将具有可选类型并且需要解包才能使用,并且由于您的后备值是一个永远不会为 nil 的字符串文字,您可以自信地使用 ! 运算符强制解包可选。

但是即使这可以用来设置一个具有回退值的变量,它仍然与您的 Ruby 示例不完全相同,因为它所做的只是检查变量的 nilness,并且而不是它是否评估为 false 或未定义。

在 Swift 中,您不能通过将变量粘贴到条件中来测试变量的假性,除非它们是符合 BooleanType 协议的类型的实例。这意味着如果你想用支持错误检查的类型实现类似的东西,你可以实现这样的东西:

var optionalBool: Bool? = false
optionalBool = optionalBool != nil ? (!optionalBool! ? true : optionalBool!) : true

如果变量为 nil 或计算结果为 false,它将向 optionalBool 变量分配回退值 true。 (optionalBool 大多数用途仍需要打开包装)

但这与未定义的变量仍然存在差异,据我所知,在这方面Ruby的||=没有任何方法Swift 不在基于回退值和其他变量值的变量实例化中内联 nilness 检查。

var optionalString: String?
var nonOptionalString = optionalString ?? "This is not optional"

注意,nonOptionalString 在这里是可选的没有意义,因为它总是有一个值。