Swift-Objekte Initialisierung (Klasse factory-Methode, Standard-init -, Komfort-init)
Hallo, ich versuche, herauszufinden, die besten Muster, um die Arbeit mit Objekten in Swift.
ich glaube, ich bekam es richtig mit der Initialisierungen, die sowohl Komfort und Standard..., aber was passiert mit der Klasse factory-Methoden?
Ich habe versucht, zu erstellen eine einfache Klasse Person und eine Unterklasse Student, mit einigen Eigenschaften und Methoden. ist es die richtige Art und Weise, es zu tun?
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)
}
}
was ist, wenn ich will, um eine Klasse factory-Methode? wäre es etwas wie dieses, oder ich mache es falsch?
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
}
ist das richtig? warum wäre es besser, verwenden Sie die init-anstelle der Klasse Fabrik?
"ist es die richtige Art und Weise, es zu tun?" – Nein, weil es nicht mal kompilieren. Gibt es typografische Anführungszeichen "" und andere offensichtliche Fehler in der syntax wie
bearbeitet... überprüfen Sie es jetzt
class Student():Person
oder class fun
.bearbeitet... überprüfen Sie es jetzt
InformationsquelleAutor Swifterino | 2014-10-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum würden Sie ein "class factory", wenn Sie verwenden können, init?
init
ist idiomatischer schnelle Möglichkeit der Erstellung neuer Objekte einer Klasse.Hinzufügen Komfort-Initialisierungen ist die richtige Wahl, in den meisten Fällen, wenn Sie möchten, fügen Sie eine Verknüpfung zu der Klasse main (bezeichnet) Initialisierer. Allerdings, in Ihrem Fall, Sie sind völlig unnötig, weil Swift unterstützt Standard-argument Werten.
Einfach definieren Sie Ihre Initialisierung etwa so:
Diese Weise können Sie es aufrufen, wie
Person()
oderPerson(name: "Andrew")
oder mit jeder anderen Kombination von Argumenten.EDIT:
Als eine Randnotiz, indem Instanzvariablen mit einem Unterstrich in der Regel nicht zu sein scheinen idiomatische Swift. Es ist in Ordnung, den Unterstrich weglassen und verwenden
self.
keine Verwechslungen zwischen lokalen und Instanz-Variablen:Ja, im wesentlichen. Möglicherweise gibt es einige Grenzfälle, wenn es notwendig sein könnte, aber ich kann nicht jeder denken, gerade jetzt. Verwenden Sie einfach die init.
wie wäre es, wenn Objekte zur Laufzeit ermittelt? Factory und Abstract Factory sind eine ziemlich standard-OO-design-patterns. Ich werde nicht einmal erwähnen, dependency injection und das weit verbreitete class-cluster-Muster. (siehe stackoverflow.com/questions/24014122/...)
Ein Problem mit dieser ist, dass der Aufruf
Person()
sagt Ihnen nichts darüber, wie das Objekt konfiguriert wird. Sagen wir, ich will eine Initialisierung setzt ein zufälliges Alter für die person ist und daher nicht ein parameter. So etwas wiePersonWithRandomAge
in Objective-C. Wie würde ich das in Swift?InformationsquelleAutor radex
Vor der letzten XCode 6.1 und Swift 1.1, war es notwendig, factory-pattern, wenn der Bau könnte scheitern, weil
init()
konnte nicht mehr zurück Optionen. Dies war auch der Grund, warum viele cocoa/objective-c-Bibliotheken importiert hatte factory-Methoden.Mit der Veröffentlichung von XCode 6.1 und Swift 1.1 und die Unterstützung für
init()
zurückkehren können Optionen, die Sie verwenden sollten, dieinit()
Muster mit Komfort-Initialisierungen. Mit diesem release, Apple verändert auch Ihre cocoa/objective-c Einfuhren zu verwenden, dieinit() -> T?
Muster über die factory-Methode.Sehen https://developer.apple.com/library/ios/releasenotes/DeveloperTools/RN-Xcode/Chapters/xc6_release_notes.html für den release notes.
Was meinst du mit "init() return Optionen"? Ich dachte Initialisierungen nicht einen Wert zurückgeben swift (im Gegensatz zu Objective-C)
Es bedeutet, dass "der Bau kann scheitern". Der Grund Klasse Fabriken in einigen anderen Sprachen ist, weil der Bau nicht scheitern. Mit Swift 1.1, Apple hat das "fail in der Lage Initialisierungen" (die werden so geschrieben, wie
init() -> T?
. Dies bedeutet effektiv, dass mit Swift, die Sie nie brauchen Fabriken.Oh, verpasst! Vielen Dank für die Klarstellung!
InformationsquelleAutor tng