Как сделать так, чтобы Тип включился - PullRequest
0 голосов
/ 10 сентября 2018

Я хотел бы сделать заявление о переключении типа данного протокола. Допустим, у меня есть:

protocol A {}

struct SA: A {}
struct SB: A {}

let aself: A.Type = SA.self
let bself: A.Type = SB.self

switch aself {
case is SA:
    break
default:
    break
}

Можно ли как-нибудь заставить работать такой переключатель? Это дает мне предупреждение, что такое преобразование всегда терпит неудачу. Можно ли это как-то сделать?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я предполагаю, что вы также захотите использовать приведенное значение типа, в этой ситуации вы можете использовать некоторое сопоставление с образцом:

switch aself {
case let a as SA.Type:
    break
default:
    break
}

Если вы не хотите использовать приведенное значение:

switch aself {
case let _ as SA.Type:
    break
default:
    break
}
0 голосов
/ 10 сентября 2018

Вы можете написать что-то вроде этого:

switch aself {
case is SA.Type:
    print("is SA.Type")
default:
    print("Unknown type")
}

Или это:

switch ObjectIdentifier(aself) {
case ObjectIdentifier(SA.self):
    print("is SA.Type")
default:
    print("Unknown type")
}

(некоторый код, объясняющий другое поведение для подклассов, как я прокомментировал ниже.)

class CA: A {}
class CAA: CA {}

let caaself: A.Type = CAA.self

switch caaself {
case is CA.Type:
    print("is CA.Type") //->is CA.Type
default:
    print("Unknown type")
}

switch ObjectIdentifier(caaself) {
case ObjectIdentifier(CA.self):
    print("is CA.Type")
default:
    print("Unknown type") //->Unknown type
}

Возможно, вам придется использовать ObjectIdentifier, если вы хотите исключить подклассы в вашем сопоставлении типов. (Могут быть и другие пути, но сейчас я не думаю ни о каких.)

...