Inicialización de objects Swift (método de fábrica de class, inicio pnetworkingeterminado, inicio de conveniencia)

Hola, estoy tratando de encontrar el mejor patrón para trabajar con objects en Swift.

Creo que lo hice bien con los inicializadores, tanto por conveniencia como por defecto … pero ¿qué pasa con los methods de fábrica de class?

Traté de crear una Persona de class simple y una Estudiante de subclass, con pocas properties y methods. ¿Es la forma más correcta de hacerlo?

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) } } 

¿Qué pasa si quiero agregar un método de fábrica de class? ¿Sería algo así o lo estoy haciendo mal?

 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 } 

¿es esto correcto? ¿Por qué sería mejor usar el init en lugar de la fábrica de class?

¿es esto correcto? ¿Por qué sería mejor usar el init en lugar de la fábrica de class?

¿Por qué crearías una "fábrica de classs" si puedes usar init? init es idiomática Forma rápida de crear nuevos objects de una class.

La adición de los inicializadores de conveniencia es la opción correcta en la mayoría de los casos cuando desea agregar un acceso directo al inicializador principal (designado) de la class. Sin embargo, en su caso, son completamente innecesarios, porque Swift admite valores de argumento pnetworkingeterminados.

Simplemente defina su inicializador de la siguiente manera:

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

De esta forma, puede invocarlo como Person() o Person(name: "Andrew") o con cualquier otra combinación de arguments.

EDITAR:

Como nota al margen, las variables de instancia de prefijo con un guión bajo generalmente no parecen ser Swift idiomático. Está bien omitir el subrayado y usarlo self. para desambiguar entre variables locales y de instancia:

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

Antes del reciente XCode 6.1 y Swift 1.1, era necesario usar un patrón de fábrica si la construcción podía fallar porque init() no podía devolver opciones. Esta fue también la razón por la cual muchas bibliotecas cocoa / objective-c importadas tenían methods de fábrica.

Con el lanzamiento de XCode 6.1 y Swift 1.1 y el soporte para init() que puede devolver opcionales, debe usar el patrón init() con inicializadores de conveniencia. Con este lanzamiento, Apple también cambió sus importaciones de cocoa / objective-c para usar init() -> T? patrón sobre el método de fábrica.

Consulte https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html para get las notas de la versión.