ruby - Swift 可选与 Ruby ||=

标签 ruby variables swift option-type

我正在从学习 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/

相关文章:

ruby-on-rails - Rails find_or_create_by 带/不带哪里

arrays - 如何将函数映射到数组的每个元素?

mysql - 错误 1193 (HY000) : Unknown system variable 'userstat'

python - 检查分配给 Python 2 中变量的文件大小

c - 将变量发送到函数并在 C 中修改此变量

ios - 返回在 UIAlertControllerStyle.ActionSheet 中选择的 Action

ruby - Rails 3 db :migrate 的未定义方法 `visitor'

ruby-on-rails - 如何用 capybara 填写日期时间字段?

ios - 如何从 App Delegate 重新加载 UIViewController 数据

ios - 无法使用协议(protocol)包含采用Codable的协议(protocol)