Случайно я заметил некоторые различия в поведении типов SomeProtocol.Protocol
и SomeProtocol.Type
(до этого я думал, что это одно и то же!):
public protocol P {
}
public class C: P {
}
protocol Q: P {}
P.self is P.Protocol // true
P.self is P.Type // false
Q.self is P.Protocol // false
Q.self is P.Type // false
C.self is P.Protocol // false
C.self is P.Type // true
// this seems to be consistent with function invocation expressions, which is expected
func a(_ x: P.Protocol) { }
func b(_ x: P.Type) { }
a(P.self)
b(P.self) // error
a(Q.self) // error
b(Q.self) // error
a(C.self) // error
b(C.self)
Что меня удивило, так это P.self is P.Protocol
, , потому что я знаю, что протоколы не соответствуют самим себе , поэтому я ожидал, что это правда ...
В любом случае, я не вижу принципиальной разницы между .Protocol
и .Type
, который вызвал эту разницу в поведении. Я ожидаю, что два синтаксиса, вероятно, означают что-то немного другое ...
Я проверил Swift руководство по метатипам , которое просто говорит:
Метатип класса, структуры или типа перечисления - это имя этого типа, за которым следует .Type
. Метатип типа протокола - а не конкретный тип, который соответствует протоколу во время выполнения - это имя этого протокола, за которым следует .Protocol
. Например, метатип типа класса SomeClass
- SomeClass.Type
, а метатип протокола SomeProtocol
- SomeProtocol.Protocol
.
Кажется, он не подтверждает существование SomeProtocol.Type
!
В чем разница между .Protocol
и .Type
?
(Если что-то неясно, я ищу ответ в строках «.Protocol
означает это , где .Type
означает")