簡體   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