嗨,我想弄清楚在Swift中使用对象的最佳模式 .
我认为我使用初始化器,方便和默认都是正确的...但是类工厂方法会发生什么?
我试图创建一个简单的类Person和子类Student,只有很少的属性和方法 . 这是最正确的方法吗?
class Person{
var _name: String
var _surname: String
var _dateOfBirthday: String
var _phoneNumb: [String]
init(name:String, surname:String, dateOfBirthday:String, phone:[String]){
self._name = name
self._surname = surname
self._dateOfBirthday = dateOfBirthday
self._phoneNumb = phone
}
convenience init() {
self.init(name:"",surname:"",dateOfBirthday:"", phone:[])
}
convenience init(name:String){
self.init(name:name,surname:"",dateOfBirthday:"", phone:[])
}
}
class Student:Person{
var _studentId:Int
init(name: String, surname: String, dateOfBirthday: String, phone: [String], id:Int) {
self._studentId = id
super.init(name: "", surname: "", dateOfBirthday: "", phone: [])
}
convenience init(){
self.init(name: "", surname: "", dateOfBirthday: "", phone: [], id:0)
}
convenience init(name:String){
self.init(name:name,surname:"",dateOfBirthday:"", phone:[], id:0)
}
}
如果我想添加一个类工厂方法怎么办?会是这样的事情还是我做错了?
class func Person() -> Person {
var x = Person()
x._telephoneNumber = [String]() // is this needed? or i can initialize it later?
return x
}
class func PersonWithName(name:String) -> Person {
var x = Person(name:name, surname:"", dateOfBirthday:"", telephoneNumber:[])
return x
}
它是否正确?为什么使用init而不是类工厂会更好?
2 回答
如果可以使用init,为什么要创建"class factory"?
init
是用于创建类的新对象的惯用Swift方法 .在大多数情况下,当您想要为类的主(指定)初始化程序添加快捷方式时,添加便利初始化程序是正确的选择 . 但是,在您的情况下,它们完全没必要,因为Swift支持默认参数值 .
只需像这样定义你的初始值设定项:
这样,您可以将其作为
Person()
或Person(name: "Andrew")
或任何其他参数组合调用 .编辑:
作为旁注,使用下划线为实例变量添加前缀通常不会省略下划线并使用
self.
来消除本地变量和实例变量之间的歧义:在最近的XCode 6.1和Swift 1.1之前,如果构造可能失败,则必须使用工厂模式,因为
init()
无法返回选项 . 这也是导入的许多cocoa / objective-c库具有工厂方法的原因 .随着XCode 6.1和Swift 1.1的发布以及对可以返回选项的
init()
的支持,您应该使用带有便利初始化程序的init()
模式 . 在此版本中,Apple还更改了他们的cocoa / objective-c导入,以使用init() -> T?
模式而不是工厂方法 .有关发行说明,请参阅https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html .