繁体   English   中英

Swift:如何比较“ if”子句中的Optional

[英]Swift: How to compare Optional in “if” clause

我正在通过使用数组构建树来练习Swift。

我有一个班级节点。 每个节点都有一个ID和一个父ID。 如果该节点是顶级节点,则父ID可以为nil。 因此,我将家长ID设为可选。

然后,我手动(出于测试目的)创建了一个节点数组,其中包含多个树。 因此,有多个父ID = nil的节点。

然后,我创建了一个函数,该函数通过其父ID查找节点。

编译器没有抱怨。 但是,当在iPhone模拟器中运行(我试图在表视图中显示节点)时, 在函数的if子句中会显示一条消息:

致命错误:解开Optional值时意外发现nil

请帮忙。 谢谢。

这是代码。 (出于我自己的习惯,我在每行末尾都写上“;”。)

class Node {
  var id:Int;
  var parent:Int!;
  init(id:Int, parent:Int!) {
    self.id = id;
    self.parent = parent;
  }
}

var allNodes = [
  Node(id:1, parent: nil),
  Node(id:2, parent: nil),
  Node(id:3, parent: 1),
  Node(id:4, parent: 1),
  Node(id:5, parent: 2),
  Node(id:6, parent: 2),
  Node(id:7, parent: 2)
];

func findNodes(parent:Int!) -> [Node] {
  var arr:[Node] = [];
  for node in allNodes {
    if node.parent == parent! {
      // if I use "if node.parent == parent" without the "!" it gives me the same error
      arr.append(node);
    }
  }
  return arr;
}

let nodes = self.findNodes(nil);
// called in tableview functions.
// same message if I use findNodes(1).

您的find函数声明为

func findNodes(parent:Int!) -> [Node]

该参数被声明为隐式解包的可选参数,因此它将在每次访问时进行解包。 如果要传递nil作为参数,则“常规”可选更有意义:

func findNodes(parent:Int?) -> [Node] {
    var arr:[Node] = [];
    for node in allNodes {
        if node.parent == parent {
            arr.append(node);
        }
    }
    return arr;
}

请注意,您可以将代码简化为(Swift 1.2):

func findNodes(parent:Int?) -> [Node] {
    return filter(allNodes) { $0.parent == parent };
}

如果nil是“ expected”值,则在Node类中将parent属性声明为可选也是更有意义的:

class Node {
    var id : Int;
    var parent : Int?;
    init(id:Int, parent : Int?) {
        self.id = id;
        self.parent = parent;
    }
}

指向父节点的(可选) 指针

var parent : Node?

但这与您的问题无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM