当有实际价值时,斯威夫特意外地发现了零

时间:2017-07-24 06:02:35

标签: swift

我有以下代码:

class User {

    var listsDict : [String : List]!

    func addList (list : List) -> Void {
        print(list.name)
        listsDict[list.name] = list
    }

    func listForName (name: String) -> List? {
        return listsDict[name]
    }

}


class List {

    let name : String
    var movies : Set<String>

    init(name: String){
        self.name = name
        movies = Set<String>()
    }

    func printList (){
        print(movies)
    }

}

var list = List(name: "List")
list.movies = Set<String>(["LOTR", "SAW", "POC"])
list.printList()


var johny = User()
johny.addList(list: list)

当我致电johny.addList(list: list)时,我收到了错误消息:

unexpectedly found nil while unwrapping an Optional value

但是有价值。我之前创建了列表实例,甚至打印在列表的日志名称中(并且已成功打印)。为什么我收到错误?

4 个答案:

答案 0 :(得分:2)

发生错误是因为listsDict被声明为隐式展开可选,但已初始化。

不使用隐式展开的可选属性,而是将字典初始化为非可选

var listsDict = [String : List]()

答案 1 :(得分:2)

每当我发现这个错误的尝试。我只是在步骤

下执行此操作

只需print("variable name")

然后我用

if <variable name> != nil {

}else{

}

这是我处理这类错误的方法。

答案 2 :(得分:1)

您没有为User.listsDict分配值,因此当您尝试向其添加值时,它会为nil。只是部分原因!除非你绝对必须,否则不应该使用。在这种情况下,你不会。

var listsDict : [String : List]!

应该是

var listsDict = [String : List]()

答案 3 :(得分:1)

由于方法中的listsDict[list.name] = list,您收到错误:

func addList (list : List) -> Void {
        print(list.name)
        listsDict[list.name] = list
}

你宣布它为:

var listsDict : [String : List]!

在未初始化的情况下附加到字典应该会导致此错误,您应该首先将其初始化(var listsDict = [String : List]()),我建议将其声明为 lazy 变量:

lazy var listsDict = [String : List]()

并且您的代码应该可以正常工作。