gpt4 book ai didi

swift - swift 中的协议(protocol)继承和结构

转载 作者:搜寻专家 更新时间:2023-11-01 06:53:26 25 4
gpt4 key购买 nike

我想创建一个具有两个属性的 Validatable 协议(protocol):一个 validator 和一个 isAbleToProceed bool 值:

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

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

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 协议(protocol):

class ViewController: Validatable {

// MARK: Internal Properties

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

}

But the compiler would report that ViewController does not conform to Validatable (does not have a Validator)

如果我将 Validator 设为父类(super class)并且所有验证器结构都变成类并从中继承,则可以解决这个问题。但是有没有办法让它与结构和协议(protocol)一起工作?

最佳答案

This question几乎是你的副本,只是它询问为什么不能通过协议(protocol)一致性来满足只能获取的属性。答案是,理论上可以,但现在不能。这里有几个 Swift 错误

  • A generic bug涵盖了这个问题的变体,以及
  • A specific bug这几乎正​​是您的问题,并且作为第一个问题的重复而被关闭。

现在,在您的情况下,您有一个 get/set 属性(至少在协议(protocol)中声明了它;您在实现中将其设置为 let)。

由于 Liskov 替换原则,我应该能够说:

var someValidatable = ViewController() as Validatable
someValidateable.validator = SocialSecurityValidator()

如果你能够做你想做的事,这会失败,原因有两个:

  1. validator 具有更严格的访问权限并且是 let 而不是 var
  2. 无法将 SocialSecurityValidator 分配给 validator,因为它的类型是 DriversLicenseValidator

关于swift - swift 中的协议(protocol)继承和结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55529673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com