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
在这里是可选的没有意义,因为它总是有一个值。
我正在从学习 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
在这里是可选的没有意义,因为它总是有一个值。