为什么这个Swift代码没有编译?
protocol P { }
struct S: P { }
let arr:[P] = [ S() ]
extension Array where Element : P {
func test<T>() -> [T] {
return []
}
}
let result : [S] = arr.test()
Run Code Online (Sandbox Code Playgroud)
编译器说:"类型P不符合协议P"(或者,在Swift的更高版本中,"不支持使用'P'作为符合协议'P'的具体类型.").
为什么不?不知怎的,这感觉就像语言中的漏洞.我意识到问题源于将数组声明arr为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
我想将泛型约束为可以用C表示的类型.在Swift标准库中是否存在所有C类型符合的协议或类型?
func doWithCType<T:CRepresentable>(cValue: T) {
// do thing with C type
}
Run Code Online (Sandbox Code Playgroud)
如果不是CRepresentable,可能是CStruct类型?
线索:
使用此C类型:
typedef struct {
int hodor;
} Hodor;
Run Code Online (Sandbox Code Playgroud)
我强制将结构转换为不兼容的类型(导致崩溃).这是错误消息:Could not cast value of type '__C.Hodor' (0x1035c0700) to 'Swift.CVarArg' (0x107196240).
我无法在任何地方找到"__C",但我希望C类型有所区别.