在Swift中创建数组时的通用问题

时间:2018-08-10 13:35:02

标签: ios swift generics protocols

这是我正在使用的协议,

public protocol PValidationCondition: Equatable {
    associatedtype T
    func isValid(value: T) -> Bool
    func errorMessage() -> String
}

这是我正在使用的模型:

struct PValidationElementWithConditions<T: PValidationCondition> {
    let validationElement: PValidationElement
    var conditions: [T] = []
}

但是我想将多个对象存储在数组中,如下所示:

var validationElementsWithConditions: [String: PValidationElementWithConditions] = [:]

但是出现以下错误:

  

“无法将类型'[String:PValidationElementWithConditions <_>]'的值转换为指定类型'[String:   PValidationElementWithConditions]'“

2 个答案:

答案 0 :(得分:3)

这是不正确的

[String: PValidationElementWithConditions]

你必须做

[String: PValidationElementWithConditions<Type>]

Type符合PValidationConditionEquatable的地方,从这里的错误很明显,它需要一个参数

PValidationElementWithConditions<_>

//

extension String  : PValidationCondition { 

    public func isValid(value: String) -> Bool {

        return true
    }

    public func errorMessage() -> String {

        return ""
    }

    public typealias T = String 

}

使用

var validationElementsWithConditions: [String: PValidationElementWithConditions<String>] = [:]

答案 1 :(得分:1)

由于它是通用的,因此需要在声明中指定类型T。例如:

var validationElementsWithConditions: [String: PValidationElementWithConditions<String>] = [:]