如何验证属性的传入数据?

时间:2017-09-30 12:32:05

标签: swift

在我的模型中,我有一个包含一些全局属性和方法的单例类。我认为我已正确设置了类,但我需要一种方法来验证属性的传入数据。我试图使用getset,但这些似乎需要返回无效。我不能使用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
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

你不应该将你的变量定义为隐式解包的选项,除非你有充分的理由这样做。

您的即时错误是您无法在setter中返回值,您需要将值赋给变量。如果您想在peopleCountnil时标记无效值,请将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
        }
    }
}