Подтвердить что ты не робот

AnyObject не работает в Xcode8 beta6?

В Xcode8 beta6 следующий код вызовет предупреждение: "is" test всегда прав. Но он не будет печатать пропуск.

    struct TestStruct {
    }

    //warning: 'is' test is always true
    if TestStruct() is AnyObject {
        print("pass")
    }

И следующий код вызовет предупреждение: Условное нажатие от 'T' до 'AnyObject' всегда выполняется

public static func register<T>(_ protocolType: T.Type, observer: T) {

    //Warning: Conditional cast from 'T' to 'AnyObject' always succeeds
    guard let object = observer as? AnyObject else {
        fatalError("expecting reference type but found value type: \(observer)")
    }
    //...
}
4b9b3361

Ответ 1

Предупреждение работает по назначению: false возврат TestStruct() is AnyObject, однако, не

В предыдущей версии этого ответа было обнаружено предупреждение,

'is' test всегда истинно

как ошибка, и содержал некоторое обсуждение относительно того, почему это воспринимаемое ошибочное предупреждение проявилось бы. Однако TestStruct() is AnyObject, оцененный как false во время выполнения, воспринимается как ожидаемое поведение.

Учитывая комментарии к отчету об ошибке поданному OP (SR-2420), ситуация выглядит наоборот: поскольку Xcode 8/beta 6, тест is всегда должен оцениваться как true, а ошибка сообщения OP: s заключается в том, что во время выполнения TestStruct() is AnyObject оценивается false.

Джо Грофф пишет:

Это правильно, потому что теперь все мосты до AnyObject.

...

is/as AnyObject всегда выполняется для всех типов. Он ведет себя как предполагалось.


Новый блок SwiftValue для преобразования значений Swift в объекты Obj-C

(для получения дополнительной информации см. обсуждение в комментариях ниже, спасибо @MartinR)

Кажется, что значения Swift, которые явно не реализованы, подлежат связыванию с объектами Obj-C через, например, соответствие _ObjectiveCBridgeable (см., например, следующее Q & A для получения подробной информации о _ObjectiveCBridgeable), вместо этого автоматически использует новый SwiftValue, чтобы разрешить преобразование к объектам Obj-C.

Начальное сообщение фиксации для swift/stdlib/public/runtime/SwiftValue.mm гласит:

Runtime: реализовать непрозрачный класс ObjC SwiftValue для хранения мостовых значений

Если нет лучшего отображения для значения Swift в Objective-Cобъект для мостовых целей, мы можем вернуться к боксу в класс. Этот класс не имеет никакого открытого интерфейса, кроме NSObject -конформируется в Objective-C, но распознается Swift runtime, чтобы он мог динамически отбрасываться обратно в коробчатый тип.

Ответ 2

Короче говоря.

Чтобы проверить, имеет ли значение ссылочный тип:

if type(of: value) is AnyClass {
    // ...
}

Чтобы проверить, является ли тип ссылочным типом:

if SomeType.self is AnyClass {
   // ...
}

Полезные ответы: