2016-07-08 10 views
0

Es funktioniert gut, wenn ich einen bestimmten Initialisierung in die Erweiterung der Struktur setzteWarum kann ich einen designierten Intelliazer nicht in eine Erweiterung einer Klasse einfügen?

struct BaseOne { 
    var a = 12 
    var b = 22 
} 
extension BaseOne { 
    init(a: Int){ 
     self.a = a 
     self.b = 231 
    } 
} 

jedoch (bitte das Beispiel wie folgt sehen), wenn ich dies für die Klasse zu tun, was beginnen war schief gegangen

class BaseOne { 
    var a = 12 
    var b = 22 
} 
extension BaseOne { 
    init(a: Int){ // Error message poped up here 
     self.a = a 
     self.b = 231 
    } 
} 

enter image description here

Kann jemand das für mich erklären?

Dank

+0

@LeoDabus Aber Bequemlichkeit initializer nicht Designated initializer. Es ist der Löschungsinitialisierer, der den designierten Initialisierer zu so etwas "job" aufruft. – SLN

Antwort

2

aus der Dokument

Alle benannten Initialisierer für eine Klasse müssen innerhalb der Klassendefinition selbst statt in einer Erweiterung geschrieben werden, da der vollständige Satz der benannten Initialisierer Teil des Schnittstellenvertrags mit Unterklassen einer Klasse ist.

Edit: Document Link

https://github.com/apple/swift/blob/master-next/docs/ObjectInitialization.rst

+0

Kiran Wäre schön, wenn Sie die URL für das von Ihnen zitierte Dokument angeben könnten – SLN

-1

Dies liegt daran, swift automatisch initializers für Sie generiert, wenn sie mit structs arbeiten. Also das ist gültig

struct BaseOneStruct { 
    var a: Int 
    var b: Int 
} 
let a = BaseOne(a: 12, b: 32) 

obwohl es keinen Initialisierer gibt. Klassen machen das aber nicht für dich. Für Ihren Code arbeiten würden Sie so etwas wie dieses

class BaseOneClass { 
    var a = 12 
    var b = 22 
    init() { } 
} 

extension BaseOneClass { 
    convenience init(a: Int){ 
     self.init() 
     self.a = a 
     self.b = 231 
    } 
} 

auch zu tun haben, beachten Sie, dass Sie in der Lage sind, die leer init BaseOneStruct() zu verwenden, da Sie die Werte für die Variablen bei ihrer Definition festgelegt

+0

Zitat aus dem Dokument: Swit stellt einen Standardinitialisierer für jede Struktur oder Klasse bereit, die Standardwerte für alle Eigenschaften bereitstellt und nicht mindestens einen Initialisierer selbst bereitstellt. – SLN