Swift Optionals vs.Ruby||=
我正在从学习Ruby过渡到Swift,并尝试建立任何有用的关联,以便更好地理解这两种编程语言中类似的概念。我注意到在Swift中有一些选项,它们要么给变量赋值,要么不给变量赋值Swift Optionals vs.Ruby||=,ruby,variables,swift,optional,Ruby,Variables,Swift,Optional,我正在从学习Ruby过渡到Swift,并尝试建立任何有用的关联,以便更好地理解这两种编程语言中类似的概念。我注意到在Swift中有一些选项,它们要么给变量赋值,要么不给变量赋值 var optinalString: String? = "This is optional" 在Ruby中,我们有| |=,据我所知,它做了一些非常类似的事情,如果用户没有给这个变量赋值,那么它将使用已经设置好的预定义变量 optionalString ||= "This is optional" 我的假设正确吗?
var optinalString: String? = "This is optional"
在Ruby中,我们有| |=
,据我所知,它做了一些非常类似的事情,如果用户没有给这个变量赋值,那么它将使用已经设置好的预定义变量
optionalString ||= "This is optional"
我的假设正确吗?总的来说,是什么使这些概念相似/不同?这两个概念并不等同 在Swift示例中,您正在创建一个类型为
String?
的变量,并将其赋值为字符串文字。在Ruby示例中,如果optionalString
未定义、为nil或求值为false(),则为optionalString
变量指定字符串文字
在Swift中,当您创建可选类型的变量时,您所做的只是指定该变量允许为nil,因此Ruby示例的更接近的表示形式可能如下所示:
var optionalString: String?
optionalString = optionalString ?? "This is optional"
var optionalBool: Bool? = false
optionalBool = optionalBool != nil ? (!optionalBool! ? true : optionalBool!) : true
它使用Swift,相当于三元条件运算符的以下用法,其中optionalString
被指定为optionalString
的展开值(如果不是零),或者如果不是零,则指定为“This is optional”的回退值
optionalString = optionalString != nil ? optionalString! : "This is optional"
请注意,通过这样做,您的变量仍将具有可选类型,并且需要展开才能使用,而且由于您的回退值是一个永远不会为零的字符串文字,因此您可以放心地使用强制展开可选类型代码>操作员
但是,即使这可以用来设置具有回退值的变量,它仍然与Ruby示例不完全相同,因为它所做的只是检查变量的零度,而不是检查它的计算结果是否为false或未定义
在Swift中,除非变量是符合BooleanType
协议的类型实例,否则无法通过将变量粘贴到条件中来测试变量的错误性。这意味着,如果希望通过支持错误检查的类型实现类似的功能,可以实现如下功能:
var optionalString: String?
optionalString = optionalString ?? "This is optional"
var optionalBool: Bool? = false
optionalBool = optionalBool != nil ? (!optionalBool! ? true : optionalBool!) : true
如果变量为nil或计算结果为false,则将为optionalBool
变量分配一个true
的回退值。(optionalBool
在大多数情况下仍需打开包装)
但这仍然与未定义的变量有所不同,据我所知,在这方面,在Swift中没有任何方法可以实现与Ruby的|124;=
的等价性,而无需在基于回退值和其他变量值的变量实例化中内联零检查
var optionalString: String?
var nonOptionalString = optionalString ?? "This is not optional"
注意,nonOptionalString
在这里是可选的,因为它总是有一个值。查找“选项类型”。它们相当普遍;特别是在函数语言中。啊!斯威夫特没有意识到的许多事情。。我知道它的简单含义,正如我所写的:)