Swift Unwrapping可选的类变量会导致失败

时间:2018-02-08 21:43:23

标签: swift class optional

在我的代码中,我有两个类:评论和BlogPosts:

class Review {
    var author = ""
    var stars = 0
}

class BlogPost {

    var title = ""
    var body = ""
    var author = ""
    var review: Review?
}

BlogPost中的审核变量是可选的,因为并非所有博文都可能都有评论。

我有一个功能可以打印帖子中的星星数量:

func checkForPostStars(post: BlogPost) {

    if let review = post.review {
        print("\"\(post.title)\" has: \(review.stars) stars")
    } else {
        print("There is no review for the post.")
    }
}

然后我创建了两篇博文。第一个没有评论,这意味着该功能应该打印"没有评论帖子"。对于其他评论,我添加了一个作者和一个明星金额,但是当我运行该功能时,它仍然会打印"该帖子没有评论"。

var firstPost = BlogPost()
firstPost.title = "Famous developer has died!"
firstPost.body = "Lorem ipsum"
firstPost.author = "Riccardo Perego"

var secondPost = BlogPost()
secondPost.title = "iOS 12 is finally out!"
secondPost.body = "Lorem ipsum"
secondPost.author = "Riccardo Perego"
secondPost.review?.author = "John"
secondPost.review?.stars = 4

checkForPostStars(post: firstPost)
checkForPostStars(post: secondPost)

我发现我可以通过添加secondPost.review = Review()来修复此问题,但我希望编译器在看到我为星标或作者设置值时自动执行此操作。感谢。

1 个答案:

答案 0 :(得分:2)

问题在于以下两行:

  secondPost.review?.author = "John"
  secondPost.review?.stars = 4

审核未初始化。就像你会将一些价值设定为零并期望它的财产生存即使它不起作用......这就是为什么?在那里。

您应该将构造函数添加到Review:

class Review {
    var author: String
    var stars: Int

    init(author: String = "", stars: Int = 0) {
    self.author = author
    self.starts = stars 
    }
}

最好不要在类级别范围内分配变量,而是在初始化程序中使用它。

问题在于你没有创建Review实例,所以你不能为它添加属性......你应该像这样处理它:

secondPost.review = Review(authoer: "John", stars: 4)

另外,出于性能原因,您应该使用Review对象struct而不是class ...

因此,如果你创建一个结构,Swift会为你找出初始化器,生活会更好:

struct Review {
    var author: String
    var stars: Int
}