gpt4 book ai didi

swift - Swift 中的通用尾部

转载 作者:可可西里 更新时间:2023-11-01 01:06:03 25 4
gpt4 key购买 nike

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($0)})

是否可以在没有 initializer arg 的情况下重写通用 tail?IE。通过序列类型(S() 或其他)调用initializer

最佳答案

对于可切片类型 T , T.SubSlice可以不同于 T .例如String.SubSlice == String ,但是Array.SubSlice == ArraySlice<T> .

你可以定义一个协议(protocol)来描述所有类型从他们自己的子切片创建:

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 .

关于swift - Swift 中的通用尾部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29893343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com