Swift класс / структура неявно соответствует NSObjectProtocol? - PullRequest
1 голос
/ 17 апреля 2019

Некоторое время назад я столкнулся со странной проблемой Swift. Когда я пытаюсь привести объект Swift к NSObjectProtocol в отладке - он выполняется успешно. Но когда этот код выполняется в сборке AppStore, он сбрасывается в ноль.

import Foundation

final class MyClass {
    let testP: String = "123"
}

struct MyStruct {
    let testP: String = "123"
}

let myClass = MyClass()
let myStruct = MyStruct()

print(myClass) // >> __lldb_expr_1.MyClass
print(myClass as! NSObjectProtocol) // >> __lldb_expr_1.MyClass
print(myStruct as! NSObjectProtocol) // >> __lldb_expr_3.MyStruct(testP: "123")

Когда я приводил struct к NSObjectProtocol, я получаю следующее предупреждение:

Cast from 'MyStruct' to unrelated type 'NSObjectProtocol' always fails

Однако, как вы можете видеть это, успешно печатает мою структуру.

Итак, вопрос: это ошибка или особенность Swift?)

PS: простите за мой французский my

Ответы [ 2 ]

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

Видимо, это и ошибка, и особенность.https://bugs.swift.org/browse/SR-10495

0 голосов
/ 17 апреля 2019

NSObjectProtocol имеет несколько методов для AnyClass, и вам необходимо соответствовать методам протокола.

Что вы можете прочитать в официальной документации Apple

Объект, соответствующий этому протоколу, можно считать первоклассный объект. О таком объекте можно спросить о его:

Класс и место его класса в иерархии наследования.

Соответствие протоколам.

Возможность ответить на конкретное сообщение.

См. На изображении методы для согласования любого объекта с NSObjectProtocol. enter image description here

Некоторая другая полезная информация для вас здесь: https://medium.com/a-swift-misadventure/why-swift-protocol-conforming-values-are-treated-as-value-types-by-default-9482c6809583

...