Es gibt einige großartige Informationen in der Dokumentation zu "associated types" in Protokollen.
Ihre Verwendung ist reichlich in der gesamten Standard-Bibliothek, die für ein Beispiel SequenceType Protokollreferenz, die ein typealias
für Generator
erklärt (und gibt an, dass es zu GeneratorType
entspricht). Dadurch kann die Protokolldeklaration auf diesen Alias-Typ verweisen.
In Ihrem Fall, wo Sie typealias SomeType = Int
verwendet, vielleicht das, was Sie war gemeint „Ich möchte Sometype zu Integer-ähnliches Verhalten gezwungen werden, weil mein Protokoll Methoden auf diesem Zwang abhängen“ - in diesem Fall sollten Sie Verwenden Sie in Ihrem Protokoll typealias SomeType: IntegerType
, und weisen Sie dann in Ihrer Klasse einen Typ diesem Alias zu, der IntegerType
entspricht.
UPDATE
Nach einem Fehler w/Apple auf dieser Öffnung ist und hatte umfangreiche Diskussion um ihn herum, ich habe zu einem Verständnis kommen, was die Basis Problem im Herzen dieser ist:
, wenn sie ein Protokoll entsprechen, Sie zu einem zugehörigen Typ nicht direkt beziehen können, die nur
(Anmerkung, howe innerhalb dieses Protokolls erklärt wurden ver, dass, wenn erstreckt ein Protokoll der zugehörige Typ verfügbar ist, wie man erwarten würde)
So in Ihrem ersten Codebeispiel:
protocol SomeProtocol {
typealias SomeType = Int
func someFunc(someVar: SomeType)
}
class SomeClass: SomeProtocol {
func someFunc(someVar: SomeType) { // use of undeclared type "SomeType"
print(someVar)
}
}
... der Fehler erneut: „Verwendung von nicht angemeldeter Typ“ist richtig, Ihre Klasse SomeClass
hat nicht den Typ SomeType
jedoch erklärt, eine Erweiterung SomeProtocol
Zugriff auf den zugehörigen Typ hat, und kann ihn bei einer Implementierung bereitstellt:
(beachten Sie, dass diese where
Klausel, um die Anforderung an den zugehörigen Typ zu definieren, unter Verwendung eines erfordert)
protocol SomeProtocol {
typealias SomeType = Int
func someFunc(someVar: SomeType)
}
extension SomeProtocol where SomeType == Int {
func someFunc(someVar: SomeType) {
print("1 + \(someVar) = \(1 + someVar)")
}
}
class SomeClass: SomeProtocol {}
SomeClass().someFunc(3) // => "1 + 3 = 4"
Schau, ich habe niemanden gebeten zu antworten, warum das Erklären von Typalias innerhalb der Klasse den Fehler behebt. Das hatte ich erkannt, bevor ich dieses Thema erstellt habe. Ich fragte, was ist die praktische Anwendung von Typalie Zuweisung innerhalb Protokoll. Um zu paraphrasieren, welche spezifischen Einschränkungen diese Funktionalität behebt? – mesmerizingr
@mesmerizingsnow Das war nur zusätzliche Informationen. Aber ich gab auch die Antwort: Eine Zuweisung hat keine Auswirkung auf das Verhalten wie keine Zuweisung ("typealias SomeType = Int" ist gleich "typealias SomeType") – Qbyte
Ich habe diese Antwort empirisch erhalten. Haben Sie etwas, um Ihre Antwort zu sichern, sagen Sie Links zu developer.apple.com Foren oder ein Zitat aus einem Blog, Twitter oder etwas? – mesmerizingr