Swift Optionals vs. Ruby || =

时间:2015-03-14 13:56:12

标签: ruby variables swift optional

我正在从学习Ruby转换到Swift并尝试建立任何有用的关联,以便更好地理解两种编程语言中的类似概念。我在Swift中注意到有些选项可能有或没有赋值给变量。

var optinalString: String? = "This is optional"

在Ruby中我们有||=根据我的理解做了非常类似的事情,如果用户没有为这个变量赋值,那么它将使用已经预定义的那个已经设定。

optionalString ||= "This is optional"

我是否在这个假设的正确轨道上?总的来说,是什么让这些概念相似/不同?

1 个答案:

答案 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在这里是可选的,因为它总是有一个值。