我正在解析一行文本中的前两个字符,并对可能的模式进行了大量比较:
在我的卡类中:
static let ourTypes = ["PL", "SY", "XT"]
在许多其他地方:
if Card.ourTypes.contains(line[0..<2]) { continue }
Swift4(3?)更改了[]以返回子字符串。我知道我可以使用String(line[0..<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