如何在 Swift 中覆盖 Objective-C 的只读属性?

Posted

技术标签:

【中文标题】如何在 Swift 中覆盖 Objective-C 的只读属性?【英文标题】:How to override read-only property from Objective-C in Swift? 【发布时间】:2015-08-06 12:20:42 【问题描述】:

在objective-c中是这样定义的:

@interface AFHTTPRequestOperation : AFURLConnectionOperation

@property (readonly, nonatomic, strong) id responseObject;

如何给这个属性赋值?

我想模拟这个属性以供以后使用。所以我需要在 Swift 中覆盖我自己的responseObject。任何想法如何做到这一点?我可以继承、扩展或其他任何东西。唯一的问题是它必须是 AFHTTPRequestOperation 的类型。

class MyRequestOperation: AFHTTPRequestOperation 

    override var responseObject: [String: AnyObject]

它会产生错误:

Getter for responseObject with Objective-C selector responseObject conflicts with getter for responseObject from superclass AHTTPRequestOperation with the same Objective-C selector

【问题讨论】:

override let responseObject = …? 然后尝试不使用初始化部分:link 我的意思就是我写的。阅读我链接的问题。 由于超类中的属性类型在 swift 版本中被声明为id,您可能应该使用 AnyObject,而不是任何更严格的类型 @The Paramagnetic Croissant - 问题中的示例与read-only property 无关 【参考方案1】:

所以,正如@Atul Mishra 所说,答案很简单:

class MyRequestOperation: AFHTTPRequestOperation 

    var myOverridenResponseObject: AnyObject?

    override var responseObject: AnyObject? 

        get 
            return myOverridenResponseObject
        

        set 
            myOverridenResponseObject = newValue
        
    

【讨论】:

【参考方案2】:

您可以通过在子类属性覆盖中同时提供 getter 和 setter 来将继承的只读属性呈现为读写属性。但是,您不能将继承的读写属性提供为只读属性。 如需更好的说明,请参阅https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html#//apple_ref/doc/uid/TP40014097-CH17-XID_300

【讨论】:

以上是关于如何在 Swift 中覆盖 Objective-C 的只读属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中覆盖 Objective-c 类函数?

在objective-c或swift中覆盖pod文件方法的最佳实践是啥?

Swift getter 覆盖非计算变量

在 Swift 3 中覆盖 UIViewController 初始化

如何在 Swift 中调用 Objective-C 类别方法

Objective-C 观察者 - 如何在 Swift 中使用