Сбой проверки типа с необязательным значением в Swift - PullRequest
0 голосов
/ 20 мая 2019

Когда у меня есть необязательное значение класса, которое соответствует протоколу, проверка типов не работает должным образом.Например:

import Foundation

protocol MyProtocol { }

class MyClass: MyProtocol { }

let myClass: MyClass = MyClass()
let myClassType = type(of: myClass)

print("myClassType is MyClass.Type: \(myClassType is MyClass.Type)")
print("myClassType is MyProtocol.Type: \(myClassType is MyProtocol.Type)")

let myClassOpt: MyClass? = MyClass()
let myClassTypeOpt = type(of: myClassOpt)

print("myClassTypeOpt is MyClass?.Type: \(myClassTypeOpt is MyClass?.Type)")
print("myClassTypeOpt is MyProtocol?.Type: \(myClassTypeOpt is MyProtocol?.Type)")

Вывод:
myClassType is MyClass.Type: true
myClassType is MyProtocol.Type: true
myClassTypeOpt is MyClass?. Тип: true
myClassTypeOpt is MyProtocol? .Type: false

Ожидаемое значение последней проверки типа - true, но получено false.
Есть ли другой способ проверить тип в этом случае?

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Вместо непосредственного использования optional для проверки его типа, вы можете использовать if-let для первого unwrap значения optional, а затем проверить его тип, т.е.

let myClassOpt: MyClass? = MyClass()

if let myClassOpt = myClassOpt {
    let myClassTypeOpt = type(of: myClassOpt)
    print("myClassTypeOpt is MyClass.Type: \(myClassTypeOpt is MyClass.Type)") //true
    print("myClassTypeOpt is MyProtocol.Type: \(myClassTypeOpt is MyProtocol.Type)") //true
}
0 голосов
/ 20 мая 2019

Результат type(of: myClassOpt) не создает переменную этого типа.Скорее, он возвращает строку, идентифицирующую тип myClassOpt.Поскольку вы объявили myClassOpt как тип MyClass?, в результате получается строка, в которой указано что-то вроде Optional<MyClass>.

Так что да, когда вы запускаете myClassTypeOpt is MyProtocol?.Type, результатом является False.

...