Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Optionals vs.Ruby||=_Ruby_Variables_Swift_Optional - Fatal编程技术网

Swift Optionals vs.Ruby||=

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" 我的假设正确吗?

我正在从学习Ruby过渡到Swift,并尝试建立任何有用的关联,以便更好地理解这两种编程语言中类似的概念。我注意到在Swift中有一些选项,它们要么给变量赋值,要么不给变量赋值

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

查找“选项类型”。它们相当普遍;特别是在函数语言中。啊!斯威夫特没有意识到的许多事情。。我知道它的简单含义,正如我所写的:)