我正在从学习 Ruby 过渡到 Swift,并尝试建立任何有用的关联,以便更好地理解两种编程语言的相似概念。我注意到在 Swift 中有一些可选项,它们要么具有或不具有分配给变量的值。
var optinalString: String? = "This is optional"
在 Ruby 中,我们有 ||=
,据我所知,它做了一些非常相似的事情,如果用户没有给这个变量赋值,那么它将使用已经存在的预定义值放。
optionalString ||= "This is optional"
我的假设是否正确?总体而言,是什么让这些概念相似/不同?
最佳答案
这两个概念并不等同。
在您的 Swift 示例中,您正在创建一个类型为 String?
的变量,并为其分配一个字符串文字的值。在 Ruby 示例中,如果 optionalString
未定义、为 nil 或求值为 false (more info),则将字符串文字分配给 optionalString
变量。
在 Swift 中,当您创建一个可选类型的变量时,您所做的只是指定该变量允许为 nil,因此您的 Ruby 示例的更接近表示可能如下所示:
var optionalString: String?
optionalString = optionalString ?? "This is optional"
它使用 Swift 的 nil coalescing operator并且等效于三元条件运算符的以下用法,其中 optionalString
被分配 optionalString
的展开值(如果它不是 nil),或者回退值“This是可选的”,如果不是。
optionalString = optionalString != nil ? optionalString! : "This is optional"
请注意,通过这样做,您的变量仍将具有可选类型并且需要解包才能使用,并且由于您的后备值是一个永远不会为 nil 的字符串文字,您可以自信地强行解包带有 !
运算符的可选。
但是即使这可以用来设置一个具有回退值的变量,它仍然与您的 Ruby 示例不完全相同,因为它所做的只是检查变量的 nilness,而不是它是否评估为 false 或未定义。
在 Swift 中,除非变量是符合 BooleanType
协议(protocol)的类型的实例,否则您无法通过将变量置于条件中来测试变量是否为假。这意味着,如果您想使用支持错误检查的类型实现类似的功能,您可以实现类似这样的功能:
var optionalBool: Bool? = false
optionalBool = optionalBool != nil ? (!optionalBool! ? true : optionalBool!) : true
如果变量为 nil 或求值为 false
,它将为 optionalBool
变量分配回退值 true
。 (对于大多数用途,optionalBool
仍需要解包)
但这仍然与 undefined variable 存在差异,据我所知,在这方面,Swift 中没有任何方法可以在不内联nilness 根据回退值和其他变量的值检查变量的实例化。
var optionalString: String?
var nonOptionalString = optionalString ?? "This is not optional"
注意,nonOptionalString
在这里是可选的没有意义,因为它总是有一个值。
关于ruby - Swift 可选与 Ruby ||=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29049731/