Generics 符合协议的Swift通用类型不能用于引用协议? 导入UIKit 协议可识别 { } 协议存储 { func test()->数据 } 类磁盘存储:存储 { func test()->数据 { return Data()//错误:T与可识别的不相同 } } 类数据 { }
我认为可以使用符合协议的泛型类型来调用引用相同协议的方法。怎么投?几乎什么都试过了,什么都没用。也许我理解错了 有人帮我吗?非常感谢试试这个Generics 符合协议的Swift通用类型不能用于引用协议? 导入UIKit 协议可识别 { } 协议存储 { func test()->数据 } 类磁盘存储:存储 { func test()->数据 { return Data()//错误:T与可识别的不相同 } } 类数据 { },generics,swift,protocols,Generics,Swift,Protocols,我认为可以使用符合协议的泛型类型来调用引用相同协议的方法。怎么投?几乎什么都试过了,什么都没用。也许我理解错了 有人帮我吗?非常感谢试试这个 import UIKit protocol Identifiable { } protocol Storage { func test() -> Data<Identifiable> } class DiskStorage<T where T:Identifiable, T:NSCoding>:Storage {
import UIKit
protocol Identifiable
{
}
protocol Storage
{
func test() -> Data<Identifiable>
}
class DiskStorage<T where T:Identifiable, T:NSCoding>:Storage
{
func test() -> Data<Identifiable>
{
return Data<T>() //error: T is not identical to Identifiable
}
}
class Data<T where T:Identifiable>
{
}
协议可识别
{}
类数据
{}
协议存储
{
typealias元素:可识别
func test()->数据
}
类磁盘存储:存储
{
func test()->数据
{
返回数据()
}
}
//来自REPL
32>var s=DiskStorage()
s:DiskStorage={}
33>s.测试()
$R0:Data={}
正如我在中指出的,
数据
与数据
没有关系。因此,您不能在需要数据的地方使用数据
,从而导致编译错误。可能相关:@CodaFi我不明白您的意思。我的观点是,Data
至少与Data
没有关系,T的语法是次优的。您可以更简单地编写DiskStorage…
非常感谢Bryan的帮助。我现在明白多了;)
protocol Identifiable
{}
class Data<T where T:Identifiable>
{}
protocol Storage
{
typealias Element : Identifiable
func test() -> Data<Element>
}
class DiskStorage<T where T:Identifiable, T:NSCoding>:Storage
{
func test() -> Data<T>
{
return Data<T>()
}
}
// from REPL
32> var s = DiskStorage<Foo>()
s: DiskStorage<Foo> = {}
33> s.test()
$R0: Data<Foo> = {}