我正在尝试获取某个类中包含的与全局变量匹配的元素的索引。使用 CSS 查询搜索节点会给我一个包含潜在匹配元素的列表,但是 — 作为 Kanna’s documentation指出 — 这样的查询返回充当数组的 XPathObjects
。我能看到从所述列表中获取索引值的唯一方法是将其从数组转换为字符串,然后可以用新行拆分;但是,我似乎无法让列表采用字符串值。典型编译 session 日志的相关部分如下:
Kazuo®/Ishiguro® Auprès® (2 pack)
Orange
Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack)
Blue
…
我已经尝试了 this thread 中一位海报建议的三种方法连接上面的输出:
1). componentsSeparatedByCharactersInSet
for node in (doc?.css("a[class^='product-link']"))! {
let multiLineString = node.text!
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.componentsSeparatedByCharactersInSet(newlineChars).filter{! $0.isEmpty}
}
理想情况下,这将打印[Kazuo®/Ishiguro® Auprès®(2 件装),橙色,Kazuo®/Ishiguro® Auprès® Folio Toujours(2 件装),蓝色]
;它会引发错误。单击 fix
会导致另一个错误 — 又一个错误。
2). split
for node in (doc?.css("a[class^='product-link']"))! {
let multiLineString = node.text!
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.utf16.split { newlineChars.characterIsMember($0) }.flatMap(String.init)
}
产生与 componentsSeparatedByCharactersInSet
相同的结果:无法调用非函数类型 'CharacterSet' 的值
-> 修复
-> 错误 -> 修复
-> 错误。
3).枚举线
for node in (doc?.css("a[class^='product-link']"))! {
let multiLineString = node.text!
var lineArray = [String]()
multiLineString.enumerateLines { (line, stop) -> () in
lineArray.append(line)
}
}
这个解决方案实际上是构建的,但是它将每个列表项作为 function()
返回。
当我在 Playgrounds 中对简单的多行字符串文字尝试这些方法时,这些方法有效,但出于某种原因,它们不适用于上面的输出。解决此问题的最简单方法是使用 func index(of element: Element) -> Int?
,但这样做会给我一个 Cannot convert value of type 'String' to expected参数类型“字符”
错误。我是 Swift 的新手,所以如果有更多经验的人可以提出解决这个问题的替代方法,我将不胜感激!
最佳答案
关于您的更大目标,您应该如何着手解决问题:
var prodIndex = 0
var testProd = "Prod" // to be replaced by user input
for node in (doc?.css("a[class^='name-link']"))! {
let words = testProd.split(separator: " ")
if prodIndex % 2 == 0 {
if node.text! == testProd {
print("FOUND: " + testProd)
}
prodIndex += 1
}
}
关于arrays - 如何在 Swift 中使用可选变量拆分多行字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48047425/