新手迅速。在我的课上,我有我的主要初始化程序(指定),如下所示:
init(name: String, location: String, image: UIImage) {
self.name = name
self.location = location
self.image = image
postDate = NSDate()
dateString = getDateString()
}
然后我在它下面有另一个初始化程序,它实际上将两个日期对象传递给参数而不是创建它们:
init(name: String, location: String, date: NSDate, dateString: String, image: UIImage) {
self.name = name
self.location = location
self.image = image
postDate = date
self.dateString = dateString
}
我需要将其作为便利初始化程序吗?如果我把它变成一个方便的话,我知道我必须把它放在方便之前,但为什么要这么麻烦?这有什么好处吗?
答案 0 :(得分:5)
在你的课堂上,你基本上是复制&粘贴在每个初始化程序中。这是一种不好的做法,因为有时你会忘记初始化一些属性(如果它是可选的)。而且所有这些重复的代码都是明确的code smell:它很难维护。如果你需要改变一些东西,可以用7 init方法改变它......
所以convenience
这里有帮助你的地方。主要思想是你有一个指定的init,一个具有最长参数列表的init(这是最具体的一个,因为你有最多的数据来创建你的对象)。如果你需要调用super,可以在这个指定的init中进行。
所有其他内容创建对象的数据较少,因此它们更通用。从这些"方便"中调用指定的init。传入默认值的inits。
class Test1 {
var name: String
var location: String
var image: UIImage
var postDate: NSDate
var dateString: String
convenience init(name: String, location: String, image: UIImage) {
self.init(name: name, location: location, date: NSDate(), dateString: "", image: image)
}
init(name: String, location: String, date: NSDate, dateString: String, image: UIImage) {
self.name = name
self.location = location
self.image = image
postDate = date
self.dateString = dateString
}
}
另外:你不应该在你的内部调用函数/方法。 self
尚未完全初始化。