gpt4 book ai didi

swift - 如何使用范围进行泛型处理?

转载 作者:行者123 更新时间:2023-11-28 08:07:20 25 4
gpt4 key购买 nike

我的意图如下:

我的第一个函数:

public func substringsOfLength(_ length: Int, inRange range: CountableClosedRange) -> Array<String>
{
...
}

我的第二个:

public func substringsOfLength(_ length: Int, inRange range: CountableRange) -> Array<String>
{
...
}

如何在一个函数中同时实现它们?我知道范围是结构,所以我不能使用泛化范式。而且我也知道,CountableRanges 符合 RandomAccessCollection 协议(protocol),并且它们的边界为 Comparable、_Strideable 和 SignedInteger (Bound.Stride)。因此,我正在寻找一个通用的解决方案,对吗?

所以我尝试了类似的方法:

public func substringsOfLength<T: RandomAccessCollection>(_ length: Int, inRange range: T) -> Array<String>
{
...
}

我知道这里缺少其他协议(protocol),但我不知道如何具体化它们的界限。

最佳答案

我会尝试一些不同的、更“敏捷”的方法……

import Foundation

let str = "1234 567 890 1 23456"

extension String {
subscript(bounds: CountableClosedRange<Int>) -> String {
get {
return self[self.index(self.startIndex, offsetBy: bounds.lowerBound)...self.index(str.startIndex, offsetBy: bounds.upperBound)]
}
}
subscript(bounds: CountableRange<Int>) -> String {
get {
return self[bounds.lowerBound...bounds.upperBound]
}
}
var count: Int {
get {
return self.characters.count
}
}

func substrings(separatedBy: CharacterSet, isIncluded: (String) -> Bool)->[String] {
return self.components(separatedBy: separatedBy).filter(isIncluded)
}
}



let a0 = str[2..<14].components(separatedBy: .whitespacesAndNewlines).filter {
$0.count == 3
}
let a1 = str[2...13].substrings(separatedBy: .whitespacesAndNewlines) {
$0.count == 3
}

打印

["567", "890"] ["567", "890"]

很快 String 将成为字符的集合,生活会更轻松......(然后只需删除部分代码)

如您所见,函数 substrings 几乎是多余的,最好将其删除。

关于swift - 如何使用范围进行泛型处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44745095/

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