Swift类/结构隐式符合NSObjectProtocol?

时间:2019-04-17 12:49:47

标签: ios swift casting nsobjectprotocol

前一段时间,我遇到了一个奇怪的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")

当我将结构强制转换为NSObjectProtocol时,会得到这样的警告:

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

但是,如何看到它成功打印了我的结构。

因此,问题是:是Bug还是Swift的功能?)

PS:对不起,我的法语

2 个答案:

答案 0 :(得分:0)

public class Main { public static void main(String[] args) { int pizza = 1; int burger = 2; int fries = 3; int FishnCHips = 4; List<String> foodList = new ArrayList<String>(); System.out.print("Which food do you want?"); foodList.add("pizza"); foodList.add("burger"); foodList.add("fries"); foodList.add("Fish and chips'"); int randomIndex = (int) (Math.random()) * foodList.size(); System.out.println("Two random foods : " + foodList.get(randomIndex)); int secondrandomIndex = (int) (Math.random()) * foodList.size(); System.out.println("Two random foods : " + foodList.get(secondrandomIndex)); 有一些用于NSObjectProtocol的方法,您需要遵守协议的方法。

您可以在官方Apple documentation中阅读什么

  

可以将符合此协议的对象视为   一流的对象。可以询问这样的对象:

     

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

     

符合协议。

     

回复特定消息的能力。

在图像中查看使任何对象与AnyClass一致的方法。 enter image description here

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

答案 1 :(得分:0)

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