据我所知,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()
为什么必须将显式定义为可选节点?
答案 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
),这是完全没必要的(和检查语言。