我已经定义了一个String类型的计算属性:
var name : String? {
//an optional variable
var theName : String?
if SOME_CONDITION {
theName = “I have a name”
}
//ERROR: '?'must be followed by a call, member lookup or subscript
return theName?
}
我想要返回任何theName
,如果它是nil,则返回nil。所以我使用return theName?
,我不想有运行时错误。然而,编译器会引发错误'?'must be followed by a call, member lookup or subscript
为什么?如何摆脱它。
答案 0 :(得分:2)
这个怎么样?对我来说看起来更优雅:
var name : String? {
let condition = true // your own condition here of course
return condition ? "I have a name" : nil
}
代码中的问题:
var name : String? {
var theName : String?
let condition = true // your own condition here of course
if condition {
theName = "I have a name"
}
return theName // get rid of the ? here
}
字段theName
已经是可选字段,无需在其中添加其他?
。
为什么我建议的解决方案不是备用解决方案:
我使用的构造称为三元运算符:
三元条件运算符是一个特殊的运算符,有三个部分,它采用形式问题?回答1:回答2。它是根据问题是真还是假来评估两个表达式之一的快捷方式。如果问题为真,则评估answer1并返回其值;否则,它会评估answer2并返回其值。
它的行为与if语句相似,但在此处适用,因为它更短,因此更清晰:根据条件,值为theName
或nil 。你真的不需要将值分配给任何其他变量,因为,毕竟,你正在计算它,所以不妨简单地在条件决定时返回它,值是什么。
答案 1 :(得分:0)
将?
添加到类型的末尾会使其成为Optional
。
将?
添加到可选变量的末尾会调用Optional Chaining。
您可以在后面放置一个问号(?)来指定可选链接 您希望调用属性,方法或的可选值 如果可选的是非零,则下标。这与放置非常相似 一个感叹号(!)后面的可选值强制 解开它的价值。主要区别在于可选链接 当optional是nil时,优先失败,而强制解包 当optional为nil时触发运行时错误。
反映可以在零上调用可选链接的事实 值,可选链接调用的结果始终是可选的 值,即使您查询的属性,方法或下标 返回非可选值。您可以使用此可选返回值 检查可选的链接呼叫是否成功( 返回的可选项包含一个值),或由于为零而未成功 链中的值(返回的可选值为nil)。
具体来说,可选链接调用的结果是相同的 键入预期的返回值,但包含在一个可选的。一个 通常返回Int的属性将返回Int?什么时候 通过可选链接访问。
class Foo {
var bar: Int
}
var x: Foo? // ? is attached to type Foo, it makes x an optional variable
let y: Int? = x?.bar // ? is attached to the variable x, this is optional chaining, it makes .bar return Int?