如何覆盖readonly属性以在子类中进行读写

时间:2015-12-17 11:21:07

标签: ios swift properties

我想覆盖readonly属性并使其可读/写。

超级班。这是一个框架,所以我不能在Swift中重写它。

@interface AWSAbstractCognitoIdentityProvider : AWSAbstractIdentityProvider
@property (nonatomic, strong, readonly) NSString *providerName;
// (...)
@end

当我导入上面的框架时,XCode7的界面预览是这样的:

public class AWSAbstractCognitoIdentityProvider : AWSAbstractIdentityProvider {
    public var providerName: String! { get }
    // (...)
}

现在,子类定义。这个类是在app中定义的,所以我试图在Swift中重写它。

// .h file
@interface AppIdentityProvider : AWSAbstractCognitoIdentityProvider
@end

// .m file
@interface AppIdentityProvider ()
@property (strong, atomic) NSString *providerName; // <=== THIS: Redeclare by removing readonly
@end

@implementation AppIdentityProvider
@synthesize providerName=_providerName;  // <=== and this

// ...
@end

如何对上面的属性进行转码?

我尝试了以下内容:

public class AppIdentityProviderSwift: AWSAbstractCognitoIdentityProvider
{

    public override var providerName: String! {
        get { return super.providerName }
        set { super.providerName = newValue } // <== compile error, the property is read only
    }
    // (...)
}

感谢。

2 个答案:

答案 0 :(得分:2)

您可以在班级中添加支持变量。如果你不需要调用你的超类“setter”,那应该没问题。

class AppIdentityProviderSwift : AWSAbstractCognitoIdentityProvider {
    private final var _providerName : String!
    override var providerName: String! {
        get {
            return _providerName
        }
        set {
            _providerName = newValue
        }
    }
}

答案 1 :(得分:1)

您可以在代码中执行以下操作

private(set) var _providerName: String!

上面的行只会对set应用private,而set将是内部的,这反过来会给你readonly行为。