在Swift 4.1中,弱属性已经deprecated in protocols,因为编译器无法强制执行它。符合协议的类的责任是定义属性的内存行为。
@objc protocol MyProtocol {
// weak var myProperty: OtherProtocol /* Illegal in Swift 4.1 */
var myProperty: OtherProtocol? { get set }
}
@objc protocol OtherProtocol: class {}
但是,这会作为强大的属性导出到MyProject-Swift.h
:
@protocol MyProtocol
@property (nonatomic, strong) id <OtherProtocol> _Nullable myProperty;
@end
现在,当符合类用Objective-C编写时,我遇到了一个问题:
@interface MyClass: NSObject<MyProtocol>
@property (nonatomic, weak) id <OtherProtocol> myProperty;
@end
错误说明retain (or strong)' attribute on property 'myProperty' does not match the property inherited
。
我该如何解决这个问题?
答案 0 :(得分:3)
您的问题确实是生成的-Swift.h
文件中的强引用。
我发现你仍然可以通过在属性之前添加@objc weak
来标记属性,因此它在Swift头中正确生成并且不会触发Swift 4.1弃用警告。
@objc protocol MyProtocol {
// weak var myProperty: OtherProtocol /* Illegal in Swift 4.1 */
@objc weak var myProperty: OtherProtocol? { get set }
}
答案 1 :(得分:1)
基于@Hamish的评论,在Swift 4.2解决问题之前的一个宜居的解决方法,不强制重写Objective-C中的协议并且影响有限,将使用clang&# 39; s诊断编译指令。
@interface MyClass: NSObject<MyProtocol>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
@property (nonatomic, weak) id <OtherProtocol> myProperty;
#pragma clang diagnostic pop
@end