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

如何利用继承属性使Swift类遵守指定协议?

问题解决:利用继承的Objective-C属性让Swift类遵守协议

首先先修正你代码中的基础语法错误:

修正后的Objective-C类ClassA

原代码中@class ClassA是类声明而非定义,且OC中字符串类型应为NSString*:

@interface ClassA : NSObject
@property (nonatomic, retain) NSString *str;
@end

修正后的Swift协议ProtocolDelegate

协议名需大写开头,且属性必须明确存取器(get/get set):

protocol ProtocolDelegate: AnyObject {
    var str: String { get set }
}

核心问题与解决方案

你无法直接通过继承的属性让ClassB遵守协议的原因是:Objective-C的NSString*属性桥接到Swift后会变为可选类型String?,而你的协议要求的是非可选类型String,类型不匹配导致Swift类型系统不认可继承属性符合协议要求。

你可以通过以下两种方式解决:

方式一:修改协议属性为可选类型

让协议属性类型与桥接后的类型匹配,此时继承的属性直接满足协议要求,无需额外实现:

protocol ProtocolDelegate: AnyObject {
    var str: String? { get set }
}

// 直接扩展遵守协议即可
extension ClassB: ProtocolDelegate {}

方式二:在扩展中手动适配属性类型

如果不想修改协议,就在ClassB的扩展中实现协议的str属性,将父类的可选类型转换为非可选类型(需处理nil场景,比如设置默认值):

extension ClassB: ProtocolDelegate {
    var str: String {
        get {
            // 父类str为nil时返回空字符串,可根据业务需求调整默认值
            super.str ?? ""
        }
        set {
            super.str = newValue
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:42:14