2017-03-08 1 views
1

In einem Super-Klasse TableViewCell rief ich eine Eigenschaft habenTyp Super Eigenschaft ändern auf schnellen

class TableViewCell { 
    var model: AnyObject? 
} 

In einer Klasse namens CountryTableViewCell Ich schrieb diesen Code

class CountryTableViewCell : TableViewCell { 

    var model:[AnyObject]? { 

     didSet { 
      // do some stuff 
     } 
    } 
} 

und ich habe diesen Fehler

Eigenschaftsmodell mit [AnyObject]? kann eine Eigenschaft mit dem Typ AnyObject nicht überschreiben?

Ist es nicht möglich, das Eigenschaftsmodell in ein Array zu ändern?

+0

versuchen, mit Überschreibung vor var Modell: [ANYOBJECT] – Kingalione

+0

nicht funktionieren, gleiche Fehler –

Antwort

2

Nein, Sie können nicht so verwenden. AnyObject sollte auch durch Any ersetzt werden, wenn mit Swift 3.

Sie können den Code wie unten ändern:

class TableViewCell { 
    var model: Any? 
} 

class CountryTableViewCell : TableViewCell { 

    override var model: Any? { 
     didSet { 
     } 
    } 
} 

Nun, wenn Sie ein Array des Modells in didSet erhalten möchten, dann können Sie es werfen geben wie unter dem Code.

class CountryTableViewCell : TableViewCell { 

     override var model: Any? { 
      didSet { 
       if let arrModel = model as? [Any] { 
        // Do Stuff... 
       } 
      } 
     } 
} 
+0

Es funktionierte perfekt danke. Aber ich benutze swift 3 und ich habe AnyObject, nicht Any verwendet. Ist das ein Problem? –

+0

@ J.Doe ab Swift 3 müssen Sie Any statt AnyObject verwenden. –

+0

Haben Sie eine Referenz? Hier sagen sie, es ist nicht das gleiche https://medium.com/@mimicatcodes/any-vs-anyobject-in-swift-3-b1a8d3a02e00#.11oyobtcw –

0

Nein der Eigenschaftstyp kann nicht geändert werden. Wenn dies erlaubt ist, wäre es die Typsicherheit verletzen, indem sie:

let subcell: CountryTableViewCell = CountryTableViewCell() 
let supercell: TableViewCell = subcell 
supercell.model = "anything that is not an array" as NSString 
let wrong = subcell.model // not an array! 

@ParthAdroja's answer zeigte eine Laufzeit Abhilfe für dieses. Sie werden beim Kompilieren kein Array erhalten, aber Sie können zumindest sicherstellen, dass Sie zur Laufzeit ein Array haben.

Im Prinzip, wenn die Eigenschaft schreibgeschützt ist, sollte diese Spezialisierung in der Unterklasse funktionieren (es ist das gleiche wie die Einschränkung des Rückgabetyps einer Funktion), aber es funktioniert nicht wie von Swift 3. Jeder kann sich darum kümmern eine SE-Anfrage an das Swift-Team ☺.

(. Zusätzlich Apple-do have some magic to make it work with bridged Objective-C classes, aber wir wissen nicht, was es noch ist)

Verwandte Themen