Generics 为什么这项协议可以;仅用作一般约束“;?

Generics 为什么这项协议可以;仅用作一般约束“;?,generics,swift,xcode6,Generics,Swift,Xcode6,我试图在Swift中执行以下操作: protocol ProtocolWithAlias { typealias T } protocol AnotherProtocol { func someFunc() -> ProtocolWithAlias } 但我得到了一个错误:协议“ProtocolWithAlias”只能用作一般约束,因为它具有自身或关联的类型要求 有可能这样做吗?错误消息(或者至少“只能用作一般约束”部分)对我来说似乎没有多大意义 我正在使用最新的Xco

我试图在Swift中执行以下操作:

protocol ProtocolWithAlias {
    typealias T
}

protocol AnotherProtocol {
    func someFunc() -> ProtocolWithAlias
}
但我得到了一个错误:
协议“ProtocolWithAlias”只能用作一般约束,因为它具有自身或关联的类型要求

有可能这样做吗?错误消息(或者至少“
只能用作一般约束
”部分)对我来说似乎没有多大意义

我正在使用最新的Xcode 6 beta 3

谢谢

试试这个:

func someFunc<T:ProtocolWithAlias>() -> T
func someFunc()->T

可以通过反转控件来实现这一点:我们不需要从someFunc返回值,而是传递一个消费者,该消费者可以接受任何类型的实现ProtocolWithAlias的协议,并对其进行处理

protocol ProtocolWithAlias {
    typealias T
}

protocol ProtocolConsumer {
    func consume<T: ProtocolWithAlias>(value: T)
}

protocol AnotherProtocol {
    func someFunc(consumer: ProtocolConsumer)
}
协议协议带别名{
别名T
}
协议协议消费者{
函数消耗(值:T)
}
协议另一协议{
func someFunc(使用者:协议使用者)
}
此技巧称为将函数转换为。不幸的是,在没有CPSing的情况下,我找不到任何方法来实现这一点。我们正在寻找的类型系统特性是存在类型(thread有一个很好的解释),但我认为Swift还不支持它们


为什么另一个答案不正确?这个签名告诉我们:

func someFunc<T:ProtocolWithAlias>() -> T
func someFunc()->T
这个函数可以为调用者选择的任何类型的实现ProtocolWithAlias的函数返回类型T的值,但是我们希望被调用者选择它

甚至不可能编写此函数的合理实现。让我们假设我有一个someFunc的实现:我可以创建一个实现ProtocolWithAlias的新类,并请求someFunc以某种方式创建此类的实例:

class Uninhabited: ProtocolWithAlias {
    typealias T = Int
    init(nope: Uninhabited) {}
}

...

let impossible: Uninhabited = someFunc<Uninhabited>()
类无人居住:ProtocolWithAlias{
类型别名T=Int
init(nope:unhabited){}
}
...
让不可能:无人居住=someFunc()

你知道为什么会这样吗?这似乎是一个相当奇怪的语法,但可能这只是因为我习惯了C:)问题是,如果您只指定协议,类型系统不知道为关联的类型插入什么,因此您可以创建一个通用函数,该函数可以专门化,以返回符合协议的任何特定具体类型,但不仅仅是“协议”。编译器应该能够解决这个问题,但目前还不能。但是如何将这个通用协议指定给一个类的实例变量呢?@Dragouf说,你有一个协议“G”具有一个通用类型“t”,你想将该协议作为一个变量添加到类“C”。类“C”的声明将是“类C”实例变量的类型是“U”@Zag,我假设“generic type”是指“associated type”。在这种情况下,类C将出现错误:“不能在其协议之外使用关联类型“T”。