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

时间:2014-06-07 04:58:07

标签: swift

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

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

我的第一个猜测类似T[Int] == U,我可以指定T可以使用Int编入索引并返回U,即:

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

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

1 个答案:

答案 0 :(得分: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]
}