为什么这个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为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
我正在尝试通过符合Encodable协议的编码模型获取数据.但它无法encode像下面的代码那样调用func :
// MARK: - Demo2
class TestClass2: NSObject, Encodable {
var x = 1
var y = 2
}
var dataSource2: Encodable?
dataSource2 = TestClass2()
// error: `Cannot invoke 'encode' with an argument list of type '(Encodable)'`
let _ = try JSONEncoder().encode(dataSource2!)
//func encode<T>(_ value: T) throws -> Data where T : Encodable
Run Code Online (Sandbox Code Playgroud)
但在另一个演示中,它运作良好,为什么?
// MARK: - Demo1
protocol TestProtocol {
func test()
}
class TestClass1: NSObject, TestProtocol {
func test() {
print("1")
}
var …Run Code Online (Sandbox Code Playgroud) 我想用Codable类型创建变量.然后在JSONEncoder类中使用它.我认为下面的代码应该可以正常工作,但它给了我错误:
无法
encode使用类型的参数列表调用(Codable).
如何声明JSONEncoder将无错的可编码变量?
struct Me: Codable {
let id: Int
let name: String
}
var codable: Codable? // It must be generic type, but not Me.
codable = Me(id: 1, name: "Kobra")
let data = try? JSONEncoder().encode(codable!)
Run Code Online (Sandbox Code Playgroud)
以下是如何使用函数传递Codable的类似问题.但我正在寻找如何使用变量(类变量)设置Codable.