将 WKNSURLRequest 转换为崩溃?其他类型

dea*_*rne 5 casting swift

当我尝试强制转换 WKNSURLRequest(和其他类,全部来自 WebKit 框架)时,我遇到了严重的崩溃。

例如在操场上:

import UIKit
import WebKit

final class Sigh: NSObject { }

NSClassFromString("NSObject") as? Sigh.Type

NSClassFromString("WKNSURLRequest") as? Sigh.Type
Run Code Online (Sandbox Code Playgroud)

NSObject 的nil强制转换有效(即返回),但 WKNSURLRequest 的强制转换因 EXC_BAD_ACCESS 而崩溃——我认为它也会返回nil

任何人都知道可能导致这种情况的原因是什么?

Mec*_*cki 4

WKNSURLRequest不继承自NSObject

@interface WKNSURLRequest : WKObject <NSCopying>
Run Code Online (Sandbox Code Playgroud)

WKObject一个根类:

NS_ROOT_CLASS
@interface WKObject <WKObject>
Run Code Online (Sandbox Code Playgroud)

与 Java 不同,Java 中所有类都必须继承自Object,Obj-C 并不要求所有类都继承自NSObject

Swift<->Obj-C 桥NSObject对其子类有明确的支持,因此也对其子类有明确的支持,但我不确定它是否可以同样好地处理所有其他根对象。在导出方面(Swift 类暴露给 Obj-C),甚至不可能创建自己的根类。一个要暴露给 Obj-C 的 swift 类必须继承自NSObject,所以我想说桥在设计时并没有考虑到任意根类。

当然,这些都不能解释崩溃,这可能只是 Swift 编译器或 Swift 运行时中的一个简单错误。由于您不是静态引用这些类,而是仅通过它们的名称来引用这些类,所以一切都在运行时发生,并且 Swift 运行时可能只是假设NSClassFromString返回的任何内容都是该类的子类NSObject,并且当它尝试与该类交互时,这将在运行时失败,因为这个假设是完全错误的。在这种情况下,恕我直言,它仍然是一个错误,但它可以解释为什么会发生崩溃。