在我的代码中,我有两个类:评论和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()
来修复此问题,但我希望编译器在看到我为星标或作者设置值时自动执行此操作。感谢。
答案 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
}