在Swift 4.1和Xcode 9.3中使用协议作为参数类型

时间:2018-03-30 09:58:59

标签: swift swift-protocols

所以我有一个枚举类型:

enum ObjectType {
   case encodable(Encodable)
   case data(Data)
   case string(String)
}

和一个功能:

func setObject<T: Encodable>(_ obj: T) {
    self.body = try? JSONEncoder().encode(obj)
}

然后我这样做时出错:

switch type {
case .encodable(let e):
    setObject(e) // e: Encodable
default: break
}
  

Cannot convert value of type 'Encodable' to expected argument type '_?'

1 个答案:

答案 0 :(得分:1)

您需要将枚举定义为通用。

enum ObjectType<E: Encodable> {
    case encodable(E)
    case data(Data)
    case string(String)
}

问题是你的枚举的基础类型是Encodable,所以传递给JSONEncoder.encode的是不是类型符合协议的对象,而是它的类型协议。这是一个微妙的区别,我真的不明白♂️