Objective-C类中实现Swift协议的弱属性

时间:2018-04-04 09:40:44

标签: swift weak-references swift-protocols swift4.1

在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

我该如何解决这个问题?

2 个答案:

答案 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