2016-08-01 11 views
1

Lassen Sie uns das folgende Stück Code haben:Warum stimmt der Typ nicht mit dem Protokoll überein?

protocol ItemView { 

    var image: UIImage? { get set } 
} 

class BaseController<T: UIView where T: ItemView>: UIViewController { 

    var itemView = T() 
} 

class ConcreteItemController: BaseController<UIImageView> { 

} 

Für die Base ich eine Fehlermeldung, „Typ‚UIImageView ItemView ‚‘‘zu Protokoll nicht konform“ bin immer.

Aber warum?

gleiche Fehlermeldung angezeigt, wenn ich dies tun statt:

typealias ConcreteItemController = BaseController<UIImageView> 

ich wirklich etwas fehlt hier bin ... warum sollte die UIImageView entsprechen nicht Protokoll ItemView? Es hat eine optionale Bildeigenschaft..so wo ist das Problem?

+3

'UIImageView' deklariert nicht, dass es' ItemView' entspricht – beyowulf

+1

Oh richtig! Ich dachte, es ist genug, um sich anzupassen, ohne es zu deklarieren .... warum gibst du das nicht als richtige Antwort, damit ich dir 10 Credits geben kann. –

Antwort

3

UIImageView erklärt nicht, dass es ItemView entspricht. Da es sich bei swift um eine streng typisierte Sprache handelt, wird keine Übereinstimmung mit Protokollen abgeleitet, da einige Typen nur zufällig übereinstimmen. Sie könnten jedoch etwas sagen wie:

protocol ItemView { 

    var image: UIImage? { get set } 
} 

class BaseController<T: UIView where T: ItemView>: UIViewController { 

    var itemView = T() 
} 

extension UIImageView: ItemView {} 

class ConcreteItemController: BaseController<UIImageView> { 

} 
+2

Erweiterung UIImageView: ItemView {} hat genügt ;-) ... –

+0

Oh natürlich, das ist viel schöner – beyowulf

+1

Ich würde nicht sagen "es ist nicht schlau genug". Es ist absichtlich, dass eine Klasse nicht zufällig einem Protokoll entspricht, sondern nur wenn es sich selbst sagt (und natürlich nur die notwendigen Bits hat). – gnasher729