В чем принципиальная разница между SomeProtocol.Protocol и SomeProtocol.Type? - PullRequest
1 голос
/ 07 мая 2020

Случайно я заметил некоторые различия в поведении типов 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 означает")

...