在我的代码中,我有两个类:评论和博客文章:
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()
来解决问题,但我希望编译器在看到我为星星或作者设定值时自动执行此问题。谢谢。
问题在这2行中:
secondPost.review?.author = "John"
secondPost.review?.stars = 4
评论未初始化。就像您会为零设定一些价值,并期望它的属性即使不起作用,它也可以生存……这就是为什么?在那里。
您应该在评论中添加构造函数:
class Review {
var author: String
var stars: Int
init(author: String = "", stars: Int = 0) {
self.author = author
self.starts = stars
}
}
也是很好的做法,不分配类级别范围上的变量,而是在启动器中使用它。
问题简单的问题是您没有创建审核实例,因此您无法添加属性...您应该像这样处理:
secondPost.review = Review(authoer: "John", stars: 4)
另外,出于绩效原因,您应该制作评论对象结构而不是类...
因此,如果您创建一个结构,那么Swift会为您弄清楚初始评估器,生活更好:
struct Review {
var author: String
var stars: Int
}