在Swift中,选项是否真的有必要?

时间:2015-07-04 05:08:07

标签: objective-c swift optional

据我所知,Swift是Objective-C的升级产品,供开发人员在其应用程序中使用。随之而来的一个新概念是“可选变量”的概念,或任何可能无效的变量。

在Objective-C中,这几乎是隐含的。您可以为多种变量指定值>>> l = [[x,l2[i]] for i,x in enumerate(l1)] >>> l [[2, 2], [4, 3], [6, 4], [8, 5]] ,但在Swift中,变量必须是可选的。

例如,Objective-C中的这种陈述完全没问题

nil

在Swift中,这段代码:

SKNode *someNode = [SKNode new];
// some methods appear that may change the value of "someNode."
// they are right here. These "methods" might leave "someNode"
// equal to "nil". If not, they might set "someNode" to a node
// equal to a node that exists already.

// check if it's nil.
if (someNode == nil) {
    // code to run if it exists
}
else {
    // code to run if it doesn't exist
}

会给出错误:

  

var node = SKNode.new() // this "node" is created/used like "someNode" is used above. if node != nil { // code that will run if node exists } else { // code to run if node doesn't exist }

但是,将Binary operator '!=' cannot be applied to operands of type 'SKNode' and 'nil'的Swift初始化更改为此,并且您将成为黄金,因为您明确node定义为可选项。

node

我可以补充说,这也不起作用:

var node : SKNode? = SKNode.new()

给出错误:

  

var node = SKNode?.new()

为什么必须将显式定义为可选节点?

1 个答案:

答案 0 :(得分:3)

var node : SKNode? = SKNode.new()中,node必须明确定义为可选项,因为SKNode.new() 永远不会返回nil。

Swift中类型的目标是保证一旦定义了变量,其类型将永远不会改变,并且变量将始终具有有效数据。将变量定义为可选(SKNode?)意味着变量是Optional<SKNode> NOT 等同于SKNode(因此'SKNode?.Type' does not have a member named 'new'

您收到的错误Binary operator '!=' cannot be applied to operands of type 'SKNode' and 'nil'是因为您正在尝试检查非可选值是Optional.None(或nil),这是完全没必要的(和检查语言。