[英]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.