我在将一些Swift可选绑定与演员转换为协议时遇到了问题。我在操场上有以下代码,工作正常。任何不一致的Casting?在可选绑定期间在Swift中嵌入协议
protocol CodeCollection {
var name: String { get }
var codes: [String] { get }
}
struct VirtualDoors: CodeCollection {
var name = "Virtual Doors"
var codes: [String] = ["doorNumba1", "doorNumba2"]
}
// Instance of VirtualDoors
let doors = VirtualDoors()
// cast into Any? like what awake(withContext context: Any?) receives
var context = doors as Any?
print(context)
if let newDoors = context as? CodeCollection {
// Works as expected
print(newDoors)
}
我使用watchKit完全相同的协议和结构为awake(withContext context: Any?)
通过了一块信息和灰失败有可选的约束力。
override func awake(withContext context: Any?) {
super.awake(withContext: context)
// Just checking to make sure the expected item is in fact being passed in
print(context)
// "Optional(VirtualDoors(name: "Virtual Doors", codes: ["doorNumba1", "doorNumba2"]))\n"
if let newDoors = context as? CodeCollection {
self.collection = newDoors
print("Context Casting Success")
} else {
// Casting always fails
print("Context Casting Fail")
}
}
如果有人能告诉我为什么这是在操场上工作,但不在watchKit类方法中,我会非常感激。
我觉得我失去了一些非常明显的东西。
你有两种不同的CodeCollection定义与不同的命名空间? –
我只有一个。只有协议有这个名字。我一直在尝试,如果我尝试转换为结构VirtualDoor类型,它工作正常,当然,我不能使用此视图来显示其他类型的集合。 – vichudson1
其实也许就是这样。协议在“共享”文件夹中的手表套件扩展名外的文件夹中定义。我确实有iOS应用程序和watchKit目标框检查它。除此之外,我不确定你的意思或如何解决它。首先尝试制作应用程序以在目标之间共享代码。有什么建议? – vichudson1