繁体   English   中英

Swift对象初始化(类工厂方法,默认初始化,方便初始化)

[英]Swift Objects initialization (Class factory method, default init, convenience init)

嗨,我想弄清楚在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而不是类工厂会更好?

它是否正确? 为什么使用init而不是类工厂会更好?

如果可以使用init,为什么要创建“类工厂”? init是用于创建类的新对象的惯用Swift方法。

在大多数情况下,当您想要为类的主(指定)初始化程序添加快捷方式时,添加便利初始化程序是正确的选择。 但是,在您的情况下,它们完全没必要,因为Swift支持默认参数值。

只需像这样定义你的初始值设定项:

init(name:String = "", surname:String = "", dateOfBirthday:String = "", phone:[String] = []) { ... }

这样,您可以将其作为Person()Person(name: "Andrew")或任何其他参数组合调用。

编辑:

作为旁注,使用下划线为实例变量添加前缀通常似乎不是惯用的Swift。 可以省略下划线并使用self. 消除本地和实例变量之间的歧义:

self.name = name
self.surname = surname
self.dateOfBirthday = dateOfBirthday
self.phoneNumb = phone

在最近的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM