在我的模型中,我有一个包含一些全局属性和方法的单例类。我认为我已正确设置了类,但我需要一种方法来验证属性的传入数据。我试图使用get
和set
,但这些似乎需要返回无效。我不能使用init,因为它是一个单例
我错过了什么吗?
final class Globals {
private init(){}
static let sharedInstance = Globals()
//MARK: Properties
private var _peopleCount: Int!
var peopleCount: Int! {
get {
return _peopleCount
}
set(newPeopleCount) {
guard newPeopleCount > 0 else {
return nil // can't return nil here
}
}
}
}
答案 0 :(得分:2)
你不应该将你的变量定义为隐式解包的选项,除非你有充分的理由这样做。
您的即时错误是您无法在setter中返回值,您需要将值赋给变量。如果您想在peopleCount
为nil
时标记无效值,请将peopleCount
定义为Int?
,并在检查失败时为其分配nil
。
final class Globals {
private init(){}
static let sharedInstance = Globals()
//MARK: Properties
private var _peopleCount: Int?
var peopleCount: Int? {
get {
return _peopleCount
}
set(newPeopleCount) {
if let newValue = newPeopleCount, newValue > 0 {
_peopleCount = newValue
}
}
}
}
对于大多数用例,不需要私有支持变量,您可以在分配之前使用didSet
检查值。感谢@LeoDabus在评论中提出这个想法。
var peopleCount: Int? {
didSet {
if let newValue = peopleCount, newValue > 0 {
peopleCount = newValue
} else {
peopleCount = oldValue
}
}
}