Swift解开可选类变量会产生故障



在我的代码中,我有两个类:评论和博客文章:

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
}

最新更新