'?'必须跟着调用,成员查找或下标

时间:2015-09-07 12:55:28

标签: ios swift

我已经定义了一个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为什么?如何摆脱它。

2 个答案:

答案 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?