2016-06-01 4 views
0

In dem Code zu ändern, die Wheeled und Vehicle Protokolle sind, die Bike Klasse entspricht die Protokolle sowohl derNicht imstande Protokollkonformität eines Objekt

protocol Wheeled { 
    var numberOfWheels: Int { get } 
} 

protocol Vehicle { 
    var maker: String { get } 
    var owner: String {get set} 
    var ownerKid: String { get } 
} 


class Bike: Vehicle, Wheeled { 
    let numberOfWheels: Int = 0 
    var ownerKid: String = "Junior" 

    var maker: String { 
     return "Ford" 
    } 

    var owner: String { 
     get { 
      return "Bob" 
     } 
     set { 
      ownerKid = "\(newValue) Junior" 
     } 
    } 
} 

let bike: Bike = Bike() 

var theBike: Vehicle = bike // #1 
var theBike: Wheeled = bike // #2 error: invalid redeclaration of 'theBike' 

Wenn ich die Eigenschaften von theBike überprüfen, in # 1, theBike Objekt nur die Eigenschaften entsprechen dem Vehicle Protokoll; während in # 2 theBike Objekt hat nur die Eigenschaften der Wheeled Eigenschaften

Daher entsprechen, fühle ich mich theBike in # 1 und # 2 ist anders, warum es mich, dass die ungültige Neudeklaration erzählt?

Frage: Wie soll ich die Protokollkonformität eines Objekts ändern? Oder ist es erlaubt, die Konformität eines Objekts zu ändern?

Schätzen Sie Ihre Zeit und Hilfe.

+1

Es hat nichts mit Protokollen zu tun - Sie haben nur zwei identisch benannte lokale Variablen. Das ist ungültig. – Hamish

+1

, weil Sie eine Variable mit demselben Namen ein zweites Mal deklarieren, was nicht erlaubt ist. – luk2302

+1

'var theBike2: Wheeled = bike' behebt es. – luk2302

Antwort

2
  • Sie können eine Variable (d. H. Mit demselben Namen) nicht zweimal deklarieren.
  • Wenn Sie auf die Eigenschaften eines anderen Protokolls zugreifen müssen, verwenden Sie if let ... as? ... zum Neuformatieren.

Beispiel:

if let theBike = theBike as? Wheeled { 
    print(theBike.numberOfWheels) 
} 
+0

OP möchte "die Protokollkonformität eines Objekts ändern". Ein 'if let'-Block für das Casting erlaubt es ihnen, eine Variable als ein anderes Protokoll unter dem gleichen Namen neu zu schreiben. – catalandres

+0

Sie haben auf das Problem hingewiesen, es war falsch, eine Variable zweimal zu deklarieren, obwohl das zweite Mal eine andere Konformität geändert wurde, aber sobald eine Variable deklariert wurde, kann sie nicht mehr geändert werden. Daher wird die zweite Zeitangabe als – SLN

+0

ungültig, da Bike konform ist Auf Wheeled sollte diese Zeile eine Warnung geben, dass die optionale Besetzung immer erfolgreich sein wird. – vikingosegundo

3

können Sie protocol<Vehicle, Wheeled> verwenden es die Typinformationen sowohl Vehicle und Wheeled zu geben, die zwar nicht die Art mit Bike direkt.

let theBike: protocol<Vehicle, Wheeled> = bike 
print(theBike.numberOfWheels) // 0 
print(theBike.owner) // Bob 
+0

Yup. Ich vergesse immer * das *. ;) Ich habe noch keinen Platz gefunden, um es zu benutzen. – catalandres

+0

@catalandres Danke für das 'Protokoll ' Tipps – SLN

1

als Bike entspricht Vehicle und Wheeled Sie können sie nur schreiben, um Variablen vom Typ Vehicle und Wheeled.

let bike: Bike = Bike() 

let wheeled: Wheeled = bike 
let vehikle: Vehicle = bike 

Aber das ist nicht sehr nützlich, da Sie Bike überall nutzen können, wo ein Vehicle oder Wheeled benötigt wird.

Wenn Sie einen Code, wo Sie eine Wheeled erwarten, aber später überprüfen, wenn es auch Vehicle ist, zeigt es ein Design-Problem.