2

不久前,我遇到了奇怪的 Swift 问题。当我尝试在调试中将 Swift 对象转换为 NSObjectProtocol 时 - 它成功执行。但是当这段代码在 AppStore 构建中执行时,它会强制转换为 nil。

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 的 bug 还是特性?)

PS:请原谅我的法语

4

2 回答 2

0

NSObjectProtocol有一些方法AnyClass,你需要遵守协议的方法。

您可以在 Apple 官方文档中阅读的内容

符合该协议的对象可以被认为是一等对象。可以询问这样的对象:

类,以及它的类在继承层次结构中的位置。

符合协议。

响应特定消息的能力。

在图像中查看使任何对象符合NSObjectProtocol. 在此处输入图像描述

其他一些对您有用的信息:https ://medium.com/a-swift-misadventure/why-swift-protocol-conforming-values-are-treatment-as-value-types-by-default-9482c6809583

于 2019-04-17T13:04:19.177 回答
0

显然,它既是错误又是功能。https://bugs.swift.org/browse/SR-10495

于 2019-05-02T08:27:05.397 回答