我有一个自定义ErrorType
,如下所示:
struct RGOServerValidationChallenge: ErrorType {
var message: String
var fieldIdentifier: String
init(message: String, fieldId: String) {
self.message = message
self.fieldIdentifier = fieldId
}
}
表示我从API调用中获得的结果的枚举,无论是成功还是失败:
enum RGOResult {
case Success(AnyObject?)
case Failures([ErrorType])
}
正如您所看到的,Failures
案例采用ErrorType
数组的参数。
但是,当我尝试将RGOServerValidationChallenge
数组传递给此枚举时,编译器会抛出以下错误:
Cannot convert value of type '[RGOServerValidationChallenge]' to expected argument type '[ErrorType]'
。
我不确定为什么会发生这种情况,因为RGOServerValidationChallenge
是ErrorType
的子对象,所以多态性应该允许我在没有强制转换的情况下传递值。
修改
我在同一个文件中制作了一个随机协议,并使RGOServerValidationChallenge
符合它而不是ErrorType
。然后我编辑了RGOResult.Failures
以将这个新协议作为参数。错误仍然存在,这表明问题不在于ErrorType
。
编辑2:
有趣的是,直接传递[RGOServerValidationChallenge]
个对象,但是当使用变量时,它不会。我的意思是:
这有效:
let errors = RGOResult.Failures([RGOServerValidationChallenge(message: "", fieldId: "")])
这不是:
let arr = [RGOServerValidationChallenge(message: "", fieldId: "")]
let errors = RGOResult.Failures(arr)
我完全被难过......
编辑3:
我刚刚按照Vince的建议在Swift 3游乐场跑了这个游戏,它看起来很有效。我想这只是一个在Swift 3中修补的Swift错误。看起来我只需要冒险尝试并升级我的代码库。