我正在从学习Ruby转换到Swift并尝试建立任何有用的关联,以便更好地理解两种编程语言中的类似概念。我在Swift中注意到有些选项可能有或没有赋值给变量。
var optinalString: String? = "This is optional"
在Ruby中我们有||=
根据我的理解做了非常类似的事情,如果用户没有为这个变量赋值,那么它将使用已经预定义的那个已经设定。
optionalString ||= "This is optional"
我是否在这个假设的正确轨道上?总的来说,是什么让这些概念相似/不同?
答案 0 :(得分:3)
这两个概念并不等同。
在Swift示例中,您正在创建类型为String?
的变量,并为其指定字符串文字的值。在Ruby示例中,如果optionalString
未定义,nil或评估为false(more info),则会为optionalString
变量分配字符串文字。
在Swift中,当你创建一个可选类型的变量时,你所做的只是指定允许变量为nil,所以你的Ruby示例的 close 表示可能看起来像这样:
var optionalString: String?
optionalString = optionalString ?? "This is optional"
使用Swift的nil coalescing operator并且相当于三元条件运算符的以下用法,其中optionalString
被赋予了optionalString
的展开值(如果它不是nil),或者如果不是,则“这是可选的”后备值。
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或评估为true
,则会将optionalBool
的后备值分配给false
变量。 (optionalBool
仍然需要为大多数用途打开包装)
但这仍然与未定义的变量有所不同,据我所知,在没有内联实例化中的nilness检查的情况下,没有任何方法可以在Swift中实现Ruby ||=
的等效性。变量的变量基于回退值和其他变量的值。
var optionalString: String?
var nonOptionalString = optionalString ?? "This is not optional"
注意,nonOptionalString
在这里是可选的,因为它总是有一个值。