如何指定在Swift中强制执行下标的泛型约束?

myt*_*thz 2 swift

如何定义一个指定T支持Int我的泛型约束中的下标的关系,以便这个函数编译?

func index<T,U>(x:T) -> U {
    return x[0] //Invalid capability as expected
}
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是T[Int] == U我可以指定的地方可以使用和T索引进行索引,即:IntU

func index<T,U where T[Int] == U>(x:T) -> U {
    return x[0]
}
Run Code Online (Sandbox Code Playgroud)

但这种语法不起作用.无论如何我可以将这种关系指定为通用约束或协议吗?

Das*_*ash 9

您可以使用实现下标功能的协议.例如:

protocol Container {
    typealias ItemType
    mutating func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}


func index<T:Container, U where U == T.ItemType>(x:T) -> U {
    return x[0]
}
Run Code Online (Sandbox Code Playgroud)