相关疑难解决方法(0)

如何将符合具有关联类型的协议的不同类型添加到集合中?

作为学习练习,我在Swift中重写我的验证库.

我有一个ValidationRule协议,定义了各个规则应该是什么样子:

protocol ValidationRule {
    typealias InputType
    func validateInput(input: InputType) -> Bool
    //...
}
Run Code Online (Sandbox Code Playgroud)

关联类型InputType定义要验证的输入类型(例如String).它可以是显式的或通用的.

这有两条规则:

struct ValidationRuleLength: ValidationRule {
    typealias InputType = String
    //...
}

struct ValidationRuleCondition<T>: ValidationRule {   
    typealias InputType = T
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在其他地方,我有一个函数来验证带有ValidationRules 集合的输入:

static func validate<R: ValidationRule>(input i: R.InputType, rules rs: [R]) -> ValidationResult {
    let errors = rs.filter { !$0.validateInput(i) }.map { $0.failureMessage }
    return errors.isEmpty ? .Valid : .Invalid(errors)
}
Run Code Online (Sandbox Code Playgroud)

我认为这会起作用,但编译器不同意.

在下面的例子中,即使输入是一个字符串,rule1的 …

generics protocols ios type-alias swift

7
推荐指数
1
解决办法
1214
查看次数

标签 统计

generics ×1

ios ×1

protocols ×1

swift ×1

type-alias ×1