ฉันจะแยกตัวอักษรสตริงหลายบรรทัดด้วยตัวแปรเสริมใน Swift ได้อย่างไร

ฉันกำลังพยายามรับดัชนีขององค์ประกอบที่มีอยู่ในคลาสหนึ่งที่ตรงกับตัวแปรโกลบอล การค้นหาโหนดที่มีการสืบค้น CSS ทำให้ฉันมีรายการที่มีองค์ประกอบที่ตรงกัน แต่ - ใน เอกสารประกอบของ Kanna ชี้ให้เห็น — ข้อความค้นหาดังกล่าวส่งคืน XPathObjects ที่ทำหน้าที่เป็นอาร์เรย์ วิธีเดียวที่ฉันเห็นเพื่อรับค่าดัชนีจากรายการดังกล่าวคือการแปลงจากอาร์เรย์เป็นสตริง ซึ่งสามารถแบ่งตามบรรทัดใหม่ได้ อย่างไรก็ตาม ดูเหมือนว่าฉันไม่สามารถรับรายการรับค่าสตริงได้ ส่วนที่เกี่ยวข้องของบันทึกเซสชันการคอมไพล์ทั่วไปมีดังนี้:

Kazuo®/Ishiguro® Auprès® (2 pack)
Orange
Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack)
Blue
…

ฉันได้ลองสามวิธีที่แนะนำโดยผู้โพสต์คนหนึ่งใน เธรดนี้เพื่อเชื่อมต่อเอาต์พุตด้านบน:

1). ส่วนประกอบSeparatedByCharactersInSet

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 pack), Orange, Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack), Blue]; มันทำให้เกิดข้อผิดพลาดแทน การคลิก fix จะทำให้เกิดข้อผิดพลาดอื่น — และอีกข้อผิดพลาดหนึ่ง

2). แยก

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: Cannot call value of non-function type 'CharacterSet' -> fix -> ข้อผิดพลาด -> fix -> ข้อผิดพลาด

3). แจกแจงLines

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 argument type 'Character' ฉันยังใหม่กับ Swift ดังนั้นหากใครก็ตามที่มีประสบการณ์มากกว่านี้สามารถแนะนำแนวทางอื่นในการแก้ไขปัญหานี้ได้ ฉันจะขอบคุณมากสำหรับความช่วยเหลือ!


person solo    schedule 01.01.2018    source แหล่งที่มา


คำตอบ (3)


สำหรับเป้าหมายที่ใหญ่กว่าของคุณ คุณควรดำเนินการแก้ไขปัญหาดังนี้:

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
    }
}
person ch1maera    schedule 07.01.2018

รหัสล้าสมัยแล้ว วิธีแรกใน Swift 3+ คือ

let newlineChars = CharacterSet.newlines
let lineArray = multiLineString.components(separatedBy: newlineChars).filter{ !$0.isEmpty }

หากต้องการใส่ข้อความในหนึ่งบรรทัดให้ใช้

let oneLine = multiLineString.components(separatedBy: newlineChars).filter{ !$0.isEmpty }.joined(separator: " ")
person vadian    schedule 01.01.2018
comment
สิ่งนี้ทำให้ฉัน: ["Kazuo®/Ishiguro® Auprès® (2 pack)"]\n["Orange"]\n["Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack)"]\n["Blue"] ฉันจะทำให้พวกมันอยู่ในบรรทัดเดียวกันได้อย่างไร? การแยกด้วยการขึ้นบรรทัดใหม่เพียงจำลองปัญหาที่แสดงไว้ด้านบน - person solo; 01.01.2018

ฉันคิดว่าคุณกำลังพยายามบอกว่าคุณต้องการ

Kazuo®/Ishiguro® Auprès® (2 pack)
Orange
Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack)
Blue

เป็นสตริงบรรทัดเดียวถูกต้องหรือไม่

for node in (doc?.css("a[class^='product-link']"))! {
    // suggestion: use a guard here, it's good practice to safely unwrap optionals
    guard let multiLineString = node.text else { return }

    let lineArray = multiLineString.components(separatedBy: .newlines).joined(separator: " ")
 }

พิมพ์: Kazuo®/Ishiguro® Auprès® (2 pack) Orange Kazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack) Blue

person mmr118    schedule 01.01.2018
comment
อืม ด้วยเหตุผลบางอย่าง ฉันยังคงได้รับผลลัพธ์ดั้งเดิมเป็น Kazuo®/Ishiguro® Auprès® (2 pack)\nOrange\nKazuo®/Ishiguro® Auprès® Folio Toujours (2 Pack)\nBlue นี่อาจเป็นปัญหาของระบบหรือไม่ - person solo; 01.01.2018
comment
ลองสลับ .newlines กับ ”\n” - person mmr118; 01.01.2018
comment
อืม อาจมีบางอย่างหายไปจากคำถามที่ไม่ชัดเจนเพราะไม่มีอะไรโดดเด่นสำหรับฉันว่าทำไมสิ่งนี้ถึงได้ผล - person mmr118; 01.01.2018
comment
คุณจะจัดการ lineArray อย่างไรเมื่อได้รับมอบหมายแล้ว - person mmr118; 01.01.2018
comment
เมื่อฉันรัน print(lineArray) มันจะให้ผลลัพธ์เหมือนกับด้านบน - person solo; 01.01.2018
comment
จริงๆแล้วมันรบกวนฉันจริงๆว่าสิ่งนี้ใช้งานไม่ได้ หากคุณต้องการ Twitter ของฉันอยู่ในบัญชี หากคุณต้องการคุณสามารถส่งข้อความถึงฉันที่นั่น และเราจะลองใช้แนวทางโดยละเอียดเพิ่มเติมในเรื่องนี้ - person mmr118; 02.01.2018