【发布时间】:2021-01-08 18:50:45
【问题描述】:
我有一个电话号码模型,如下所示:
import UIKit
import Foundation
struct PhoneValidation : OptionSet {
let rawValue: Int
static let phoneInValid = PhoneValidation(rawValue: 1 << 0)
static let phoneValid = PhoneValidation(rawValue: 1 << 1)
static let smsValidationAttempted = PhoneValidation(rawValue: 1 << 2)
static let smsValidationFailed = PhoneValidation(rawValue: 1 << 3)
static let smsValidationSuccessful = PhoneValidation(rawValue: 1 << 4) // OTP is successfully validated in backend. The field should be non-editable in this duration
static let smsValidationOTPTriggered = PhoneValidation(rawValue: 1 << 5) // OTP validation triggered. The field should be non-editable in this duration
}
class PhonesViewModel: NSCopying {
public var phoneType: PhoneNumberType = PhoneNumberType.mobile
public var phone: String?
public var code: String?
public var countryCode: String?
public var isValid : PhoneValidation?
func copy(with zone: NSZone? = nil) -> Any {
let copy = PhonesViewModel()
copy.phoneType = phoneType
copy.phone = phone
copy.code = code
copy.countryCode = countryCode
copy.isValid = isValid
return copy
}
}
正如您在上面看到的,手机模型可以在不同状态之间转换。 SMS 验证适用于少数国家,少数国家不适用。因此,我计划在 SMS 验证适用于某个国家/地区并且正在进行验证时设置 smsValidationOTPTriggered 状态。
我需要的是,在设置状态 smsValidationOTPTriggered 或 smsValidationSuccessful 时,我不希望应用程序的任何模块修改模型的值(phoneType、phone、code、countryCode)。换句话说,我希望模型在模型中设置这两种状态时切换到只读模式,并希望在尝试修改时通知模块错误或异常。
对于我在这里想要实现的目标,是否已有最佳实践可用?在提出这个问题之前我已经搜索过,但没有找到。我怎样才能做到这一点?
谢谢, 拉吉·帕万·古姆达尔
【问题讨论】:
-
为什么不从你的类的不可变版本开始呢?就像字符串和可变字符串、数组和可变数组等等。因此,没有人可以保留对您的模型的可变引用。
-
另外,无论如何您都不应该允许直接访问模型属性。所有属性都应该是私有的访问器。所以访问者可以锁门。
标签: ios swift xcode cocoa-touch immutability