swift中的协议继承和结构

问题描述 投票:1回答:1

我想创建一个Validatable协议,它有两个属性:一个validator和一个isAbleToProceed布尔值:

protocol Validatable {
    var validator: Validator { get set }
    var isAbleToProceed: Bool { get set }
}

我想定义不同类型的Validators(出生日期验证器,电子邮件验证器等)。为此,我创建了一个工厂:

protocol Validator {}

struct ValidatorFactory {
    internal static let sharedInstance = ValidatorFactory()

    func dateOfBirthValidator(minimumAge: Int, maximumAge: Int) -> DateOfBirthValidator {
        return DateOfBirthValidator(minimumAge: minimumAge, maximumAge: maximumAge)
    }

    func driversLicenseValidator(minLicenseDuration: Int) -> DriversLicenseValidator {
        return DriversLicenseValidator(minLicenseDuration: minLicenseDuration)
    }
}

这是DateOfBirthValidator的实现:

struct DateOfBirthValidator: Validator {
    let minimumAge: Int
    let maximumAge: Int

    func isDateOfBirthValid(date: Date) -> Bool {
        if let age = Calendar.current.dateComponents([.year], from: date, to: Date()).year {
            return (minimumAge ... maximumAge).contains(age)
        } else {
            return false
        }
    }
}

然后我会有一个类ViewController,实现Validatable协议:

class ViewController: Validatable {

    // MARK: Internal Properties

    internal var validator: DriversLicenseValidator
    internal var isAbleToProceed: Bool = false

}

但编译器会报告ViewController不符合Validatable(没有Validator)

如果我使Validator成为超类并且所有验证器结构变成类并从中继承,则可以解决这个问题。但有没有办法让它与结构和协议一起工作?

swift struct
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.