В документации по протоколу "associated types" имеется подробная информация.
Их использование в изобилии по всей стандартной библиотеки, для примера ссылки на протокол SequenceType, который объявляет typealias
для Generator
(и указывает, что оно соответствует GeneratorType
). Это позволяет объявлению протокола ссылаться на этот псевдонимов.
В вашем случае, когда вы использовали typealias SomeType = Int
, возможно, что вы имели в виду был «Я хочу SomeType быть ограничен в Integer-подобного поведения, потому что мои методы протокола будет зависеть от этого ограничения» - в этом случае, вы можете захотеть использовать в своем протоколе typealias SomeType: IntegerType
, а затем в своем классе перейти к назначению типа для этого псевдонима, который соответствует IntegerType
.
UPDATE
После открытия ошибки ж/Apple, на этом и имел широкое обсуждение вокруг него, я пришел к пониманию того, что базовая проблема лежит в основе этого:
, когда в соответствии с протоколом, вы не можете напрямую обратиться к соответствующему типу, который был объявлен только в рамках этого протокола
(примечание, Хау верь, что когда простирающийся протокол ассоциированный тип доступен, как и следовало ожидать)
Так что в вашем исходном примере кода:
protocol SomeProtocol {
typealias SomeType = Int
func someFunc(someVar: SomeType)
}
class SomeClass: SomeProtocol {
func someFunc(someVar: SomeType) { // use of undeclared type "SomeType"
print(someVar)
}
}
... повторная ошибка: «Использование необъявленной типа»правильно, ваш класс SomeClass
не объявлен типа SomeType
Однако расширение SomeProtocol
имеет доступ к связанному типу и может относиться к нему, когда обеспечивая выполнение:
(обратите внимание, что это требует использование пункта where
для того, чтобы определить требования по соответствующему типу)
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"
Слушайте, я не просил кого-нибудь ответить, почему объявление титалий внутри класса разрешает ошибку. Я понял, что до того, как я создал эту тему. Я спросил, что такое практическое применение назначения типов в протоколе. Перефразируя, какие конкретные ограничения решаются этой функцией? – mesmerizingr
@mesmerizingsnow Это была дополнительная информация. Но я также дал ответ: присваивание не влияет на поведение, как отсутствие назначения ('typealias SomeType = Int' равно' typealias SomeType') – Qbyte
Я получил этот ответ эмпирически. У вас есть что-то, чтобы поддержать ваш ответ, скажем, ссылки на форумы developer.apple.com или некоторые цитаты из какого-то блога, твиттера или что-то еще? – mesmerizingr