繁体   English   中英

Swift:声明扩展名,该类型数组符合协议

[英]Swift: Declare in an extension that an array of a type conforms to a protocol

我已经声明了一个称为“ Validates”的协议,该协议可以验证字符串。 我已经将此扩展添加到所有Strings中。 代码看起来像这样,并且运行良好:

protocol Validates {
    func validateWithRules(rules: [Rule]) throws
}

extension String: Validates {

    func validateWithRules(rules: [Rule]) throws {

        var validationErrors = [RuleFailError]()

        for aRule in rules {
            do {
                try aRule.validate(self)
            }
            catch let error as RuleFailError {
                validationErrors.append(error)
            }
        }

        if validationErrors.count > 0 {
            throw ValidationError(ruleErrors: validationErrors)
        }
    }
}

我省略了几件事,但是您的要点是。

下一步是对字符串数组执行相同的操作。 理想情况下,我想创建一个扩展,声明一个给定Validate的事物的集合,该集合本身也应进行验证。 失败了,因为目前这仅适用于Strings,所以我可以声明任何Strings数组都可以验证。

我已经尝试过了,但是无法编译。

extension CollectionType where Generator.Element == Validates: Validates {

    func validateWithRules(rules: [Rule]) throws {

        var validationErrors = [RuleFailError]()

        for anItem in self {
            do {
                try anItem.validateWithRules(rules)
            }
            catch let error as ValidationError {
                for failedRule in error.ruleErrors {
                    validationErrors.append(failedRule)
                }
            }
            catch {}
            if validationErrors.count > 0 {
                throw ValidationError(ruleErrors: validationErrors)
            }
        }
    }
}

如果我正确理解您要做什么,则必须像下面这样调用协议方法:

let testArray: [String] = ["str1", "str2", "str3"]
testArray.protocolMethod()

然后,您需要像这样进行extention

extension CollectionType where Generator.Element: Validates {
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM