为什么这个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为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
我只是很好奇如何将具有String键和Encodable值的字典编码为JSON。
例如:
let dict: [String: Encodable] = [
"Int": 1,
"Double": 3.14,
"Bool": false,
"String": "test"
]
Run Code Online (Sandbox Code Playgroud)
其中的键dict都是type String,但是值的类型各不相同。
但是,JSON中允许所有这些类型。
我想知道JSONEncoder在Swift 4中是否有一种方法可以将其编码dict为JSON Data。
我确实知道还有其他方法无法使用JSONEncoder,但是我只是想知道是否JSONEncoder有能力进行管理。
将Dictionary确实有func encode(to encoder: Encoder) throws在扩展,但仅适用于约束Key: Encodable, Key: Hashable, Value: Encodable,而对于我们dict,它需要约束Key: Encodable, Key: Hashable, Value == Encodable。
struct为此拥有一个就足够了JSONEncoder,
struct Test: Encodable {
let int = 1
let double …Run Code Online (Sandbox Code Playgroud)