Swift 中的通用尾巴
Generic tail in Swift
tail
数组:
private extension Array {
var tail: Array { get { return Array(dropFirst(self)) } }
}
这里是 Sliceable
的通用版本:
public func tail<S: Sliceable>(sequence: S, initializer: ((S.SubSlice) -> S)) -> S {
return initializer(dropFirst(sequence))
}
let s = tail("12", {String([=12=])})
是否可以在没有 initializer
arg 的情况下重写泛型 tail
?
IE。通过序列类型(S()
或其他)调用 initializer
?
对于可切片类型 T
,T.SubSlice
可以不同于 T
。
例如 String.SubSlice == String
,但 Array.SubSlice == ArraySlice<T>
。
你可以定义一个协议来描述所有类型
从他们自己的子切片创建:
public protocol CreatableFromSubslice : Sliceable {
init(_ subslice : Self.SubSlice)
}
即使大多数(全部?)内置的可切片类型都可以从它们自己的类型中创建
子切片,你仍然必须告诉编译器空
扩展名:
extension String : CreatableFromSubslice { }
extension Array : CreatableFromSubslice { }
// ...
那么tail()
可以定义为
public func tail<S: CreatableFromSubslice>(slice: S) -> S {
return S(dropFirst(slice))
}
示例:
let s = tail("12")
println(s) // "2"
let a = tail([1, 2, 3])
println(a) // [2, 3]
对于 等于 其子切片类型的类型,您可以定义
public func tail<S: Sliceable where S.SubSlice == S >(slice: S) -> S {
return dropFirst(slice)
}
这可以应用于 String
,但不适用于 Array
。
tail
数组:
private extension Array {
var tail: Array { get { return Array(dropFirst(self)) } }
}
这里是 Sliceable
的通用版本:
public func tail<S: Sliceable>(sequence: S, initializer: ((S.SubSlice) -> S)) -> S {
return initializer(dropFirst(sequence))
}
let s = tail("12", {String([=12=])})
是否可以在没有 initializer
arg 的情况下重写泛型 tail
?
IE。通过序列类型(S()
或其他)调用 initializer
?
对于可切片类型 T
,T.SubSlice
可以不同于 T
。
例如 String.SubSlice == String
,但 Array.SubSlice == ArraySlice<T>
。
你可以定义一个协议来描述所有类型 从他们自己的子切片创建:
public protocol CreatableFromSubslice : Sliceable {
init(_ subslice : Self.SubSlice)
}
即使大多数(全部?)内置的可切片类型都可以从它们自己的类型中创建 子切片,你仍然必须告诉编译器空 扩展名:
extension String : CreatableFromSubslice { }
extension Array : CreatableFromSubslice { }
// ...
那么tail()
可以定义为
public func tail<S: CreatableFromSubslice>(slice: S) -> S {
return S(dropFirst(slice))
}
示例:
let s = tail("12")
println(s) // "2"
let a = tail([1, 2, 3])
println(a) // [2, 3]
对于 等于 其子切片类型的类型,您可以定义
public func tail<S: Sliceable where S.SubSlice == S >(slice: S) -> S {
return dropFirst(slice)
}
这可以应用于 String
,但不适用于 Array
。