无法分配值:“自身”在Swift中是不可变的

时间:2019-01-31 14:28:30

标签: swift

我正在开发一个必须同时处理Swift和Objective-c的应用程序。 我在Swift和Objective-C中使用了如下模型类“ AccountModel”

@objc class AccountModel : NSObject {

    @objc var accountNumberString : String
    var accountAliasString : String
    @objc var currentBalanceNumber : Double
    @objc var availableBalanceNumber : Double
    .......
     init?(json: Dictionary<String, AnyObject>) 
     {.....}
 }

现在我已经为MVVM逻辑创建了以下协议

protocol AccountListlViewModel {
    var isTransactionalAccount: Bool { get }
    var isSavingAccount: Bool { get }

    var savingAccountModel : AccountModel {get set}

}

extension AccountModel: AccountListlViewModel {
    var savingAccountModel: AccountModel {
        get {
            return self
        }
        set {
            self = newValue   *//ERROR . Cannot assign to value: 'self' is immutable'*
        }
    }

    var isTransactionalAccount: Bool {
        if self.issuingProductCodeString == account_type_Transactional {
            return true
        }
        return  false
    }

    var isSavingAccount: Bool {
        if self.issuingProductCodeString == account_type_Saving {
            return true
        }
        return  false
    }
}

但是我遇到错误

  

“无法分配值:'自身'是不可变的”

当我尝试在GET SET中设置SavingAccountModel时

我知道,如果将AccountModel创建为结构体,那么我就可以设置saveAccountModel,但是我也无法像在Objective-c中那样将AccountModel创建为结构体。

请提出如何设置属性 savingAccountModel 的建议。任何想法或建议都很好。

1 个答案:

答案 0 :(得分:1)

基于上述(帐户不能同时既是储蓄又是交易性的),您实际上应该在这里考虑继承,而不是像这样的协议/扩展

class SavingsAccount: AccountModel {
    //Savings specific code and properties
}

class TransactionalAccount: AccountModel {
    //Transactional specific code and properties
}

然后,您可以通过多种方式测试帐户类型。一种可能是尝试投射您的实例。

if let savingsAccount = account as? SavingsAccount {
    //Do some savings account stuff here
}
//Similar for other account types