Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 符合协议的Swift通用类型不能用于引用协议? 导入UIKit 协议可识别 { } 协议存储 { func test()->数据 } 类磁盘存储:存储 { func test()->数据 { return Data()//错误:T与可识别的不相同 } } 类数据 { }_Generics_Swift_Protocols - Fatal编程技术网

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> = {}