如何利用继承属性使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
相关产品推荐
相关产品推荐

