2017-07-24 22 views
-2

我有以下代码:斯威夫特意外地发现为零时,有实际价值

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 

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

+0

错误来自'listsDict',它是'nil'。你应该在'User'中初始化'listsDict'。顺便说一句,“列表”是一个坏的名字。 ;) – clemens

+0

var listsDict:[String:List]! to var listsDict:[String:List] = [:] –

+0

@macmoonshine oh ..抱歉) –

回答

2

发生错误是因为listsDict被声明为隐式解包可选,但是不是初始化。

而不是使用一个隐含的展开可选属性的初始化字典非可选

var listsDict = [String : List]() 
+0

is()等于[Object new];在Obj-c? –

+0

@EvgeniyKleban是的。 – vadian

1

您永远不会为User.listsDict指定一个值,因此当您尝试向其中添加值时它是零。只是原因的一部分!永远不要使用,除非你绝对必须。在这种情况下,你不会。

var listsDict : [String : List]! 

应该

var listsDict = [String : List]() 
1

你的方法得到一个错误,因为listsDict[list.name] = list

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

你宣布它为:

var listsDict : [String : List]! 

追加到字典没有初始化它应该ca使用这个错误,你应该首先将其初始化(var listsDict = [String : List]()),我会建议其声明为变量:

lazy var listsDict = [String : List]() 

您的代码应能正常工作。

2

每当我发现这个错误尝试。我只是这样做下面的步骤

只是print("variable name")

然后我用

if <variable name> != nil { 

}else{ 

} 

这是我处理这些类型的错误的方式。

+3

你应该使用条件绑定来代替('如果let ...','guard let ...')。很少需要检查变量是否为“nil”,而不需要使用该变量 – Alexander

相关问题