You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何打印实例地址?协议实现类报错解决方案咨询

解决Unmanaged使用时的"Person be a class type"错误

错误核心原因是Person协议未限制仅类类型遵循,而Unmanaged仅支持对类实例进行操作。以下是三种可行的解决方法:

方法一:将协议限制为类专属

修改Person协议,添加: AnyObject约束,确保只有类能遵循该协议:

protocol Person: AnyObject {
    var name: String { get }
}

class Parent: Person {
    let name: String
    init(name: String) {
        self.name = name
    }
}

let parent = Parent(name: "Jeff")
print(Unmanaged.passUnretained(parent).toOpaque())

添加约束后,编译器能确定Person类型必然是类实例,Unmanaged可正常调用。

方法二:显式指定变量类型为类

保持协议不变,将parent的类型明确声明为Parent,而非默认推断的Person:

protocol Person {
    var name: String { get }
}

class Parent: Person {
    let name: String
    init(name: String) {
        self.name = name
    }
}

let parent: Parent = Parent(name: "Jeff")
print(Unmanaged.passUnretained(parent).toOpaque())

明确类型后,编译器直接识别这是类实例,不会触发协议类型的约束检查。

方法三:强制转换为AnyObject

如果不想修改协议或变量类型,可将实例强制转为AnyObject后传入Unmanaged:

protocol Person {
    var name: String { get }
}

class Parent: Person {
    let name: String
    init(name: String) {
        self.name = name
    }
}

let parent = Parent(name: "Jeff")
print(Unmanaged.passUnretained(parent as AnyObject).toOpaque())

AnyObject代表类实例类型,转换后Unmanaged可以正常处理。

内容的提问来源于stack exchange,提问作者Beginnerrrrrr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:40:26