Swift4正确的方法来针对字符串测试子字符串?

时间:2019-06-13 17:34:43

标签: swift string

我正在解析一行文本中的前两个字符,并对可能的模式进行了大量比较:

在我的卡类中:

static let ourTypes = ["PL", "SY", "XT"]

在许多其他地方:

if Card.ourTypes.contains(line[0..<2]) { continue }

Swift4(3?)更改了[]以返回子字符串。我知道我可以使用String(line[0..<2])来回退,但是我怀疑这是错误的解决方案...还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

一种方法是将ourTypes数组设置为[Substring],然后不必转换Substring即可使contains起作用:

static let ourTypes: [Substring] = ["PL", "SY", "XT"]

if Card.ourTypes.contains(line.prefix(2)) { continue }

@matt的观察发现,用contains搜索Set更好(因为它效率更高)可以通过以下方式实现:

static let ourTypes: Set<Substring> = ["PL", "SY", "XT"]

答案 1 :(得分:2)

虽然有点刺耳,但String转换并不昂贵。从一个字符串中得出一个真正的独立子字符串只需 ,这是一个两步过程:访问切片,然后从原始链接中取消索引和存储的链接。这就是String()在这里的全部含义。因此,我认为您的原始方法实际上是正确且无问题的。

但是,如果您确实想保留在String世界中,则可以通过调用removeSubrange而不是进行切片来实现。您放弃了切片表示法和与切片相关的方法的便利,但是一切都取决于您的优先级。顺便说一句,如果contains是这里的主要测试,请使用Set而不是Array:

let ourTypes = Set(["PL", "SY", "XT"])
var line = "PLARF"
line.removeSubrange(line.index(line.startIndex, offsetBy: 2)...)
ourTypes.contains(line) // true