คำเตือน: 'ตัวอักษร' ถูกคัดค้าน: โปรดใช้สตริงหรือซับสตริงโดยตรง


162

อักขระ - คุณสมบัติอินสแตนซ์ของ String ถูกคัดค้านด้วยXcode 9.1

มันเป็นประโยชน์มากที่จะได้รับจากการย่อย String โดยใช้charactersคุณสมบัติ แต่ตอนนี้มันได้รับการคัดค้านและ Xcode substringแนะนำให้ใช้ ฉันได้ลองตรวจสอบคำถามและคำแนะนำสำหรับนักพัฒนา Apple สำหรับแนวทางเดียวกัน แต่ไม่เห็นวิธีแก้ปัญหา / ทางเลือกตามที่แนะนำ

นี่คือข้อความเตือน:

'characters' ไม่ได้รับการสนับสนุน: โปรดใช้สตริงหรือสตริงย่อย

ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้ดำเนินงานสตริงจำนวนมากดังนั้นจะดำเนินการ / charactersการจัดการใช้ทรัพย์สิน

ใครมีความคิด / ข้อมูลเกี่ยวกับการอัปเดตนี้บ้าง


5
นี่คือบทความที่น่าสนใจเกี่ยวกับStringการเปลี่ยนแปลงจากสวิฟท์ 3-4 และโปรดอ่านยังSE0163
Vadian

5
ลองใช้countแทน
holex

1
หากคุณใช้string.characters.forEachAPI ใหม่คือstring.forEach { char in process(char) }
Efren

คำตอบ:


270

Swift 4 แนะนำการเปลี่ยนแปลงใน API สตริง
คุณสามารถใช้!stringValue.isEmptyแทนstringValue.characters.count > 0

สำหรับข้อมูลเพิ่มเติมคุณจะได้รับตัวอย่างจากที่นี่

สำหรับเช่น

let edit = "Summary"
edit.count   // 7

ขอบคุณสำหรับคำตอบของคุณ .. แต่ฉันขออ้างอิงรายละเอียดของสตริงย่อยได้ไหม นี่เป็นเพียงตัวอย่างตัวอย่างฉันมีการปฏิบัติการอื่น ๆ ที่เกี่ยวข้องกับตัวละครอีกมากมาย
Krunal

1
กรุณาตรวจสอบข้อมูลรายละเอียดจากที่นี่ developer.apple.com/library/content/documentation/Swift/…
songxunzhao

ให้ทักทาย = "สวัสดีโลก!" ให้ดัชนี = greeting.index (จาก: ",") ?? greeting.endIndex ให้เริ่มต้น = ทักทาย [.. <ดัชนี]
songxunzhao

1
อ้างอิงออนไลน์สำหรับSubstring
Dennis Vennink

32
อย่าใช้การนับ> 0 เพื่อตรวจสอบว่าคอลเล็กชันว่างเปล่าหรือไม่ มีคุณสมบัติในคอลเลกชันที่เรียกว่า isEmpty สำหรับสิ่งนั้น จากเอกสารเมื่อคุณต้องการตรวจสอบว่าคอลเลกชันของคุณว่างเปล่าให้ใช้คุณสมบัติ isEmpty แทนการตรวจสอบว่าคุณสมบัติการนับเท่ากับศูนย์ สำหรับคอลเลกชันที่ไม่สอดคล้องกับ RandomAccessCollection การเข้าถึงคุณสมบัติการนับจะวนซ้ำผ่านองค์ประกอบของคอลเลกชัน
Leo Dabus

82

Swift 4 vs Swift 3 ตัวอย่าง:

let myString = "test"

for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4

let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4

2
นี่ควรเป็นคำตอบที่ยอมรับได้ คำถามเกี่ยวกับการแทนที่ string.characters.count ไม่ใช่การแทนที่เพื่อเปรียบเทียบกับศูนย์ ที่กล่าวถึงในภาพหน้าจอเท่านั้น
Timothy Kanski

9

หนึ่งในกรณีที่พบบ่อยที่สุดสำหรับการจัดการสตริงคือการตอบสนอง JSON ในตัวอย่างนี้ฉันสร้างส่วนขยายในแอพนาฬิกาเพื่อวางอักขระตัวสุดท้าย (n) ของวัตถุ Bitcoin JSON

สวิฟท์ 3:

func dropLast(_ n: Int = 0) -> String {
    return String(characters.dropLast(n))

ข้อผิดพลาด Xcode 9.1:

'ตัวอักษร' ถูกคัดค้าน: โปรดใช้สตริงหรือซับสตริงโดยตรง

Xcode จะบอกเราจะใช้ตัวแปรสตริงหรือวิธีการโดยตรง

สวิฟท์ 4:

func dropLast(_ n: Int = 0) -> String {
    return String(dropLast(n))
    }

การขยายที่สมบูรณ์:

extension String {
    func dropLast(_ n: Int = 0) -> String {
        return String(dropLast(n))
    }

    var dropLast: String {
        return dropLast()
    }
}

โทร:

print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")

คอนโซล:

//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal

ตัวอย่างเพิ่มเติม:

  • print("Spell has \(invisibleSpellName.count) characters.")
  • return String(dropLast(n))
  • return String(removeLast(n))

เอกสารอ้างอิง:

คุณจะมักจะสามารถใช้วิธีการทั่วไปเช่นdropLast()หรือremoveLast()หรือcountเพื่อให้ที่นี่เป็นเอกสารแอปเปิ้ลที่ชัดเจนสำหรับแต่ละวิธี

droplast ()

removelast ()

ตัวละครนับ


2

คำเตือนนั้นเป็นเพียงส่วนบนของภูเขาน้ำแข็งมีการเปลี่ยนแปลงของสายอักขระสตริงเป็นคอลเลกชันของตัวละครอีกครั้ง แต่เราได้สิ่งใหม่และยอดเยี่ยม subStrings :)

นี่คือการอ่านที่ดีเกี่ยวกับเรื่องนี้: https://useyourloaf.com/blog/updating-strings-for-swift-4/


2

ใช้สิ่งนี้charactersเพราะStringหยุดการรวบรวมใน Swift 2.0 อย่างไรก็ตามนี่ยังคงเป็นรหัสที่ถูกต้องใน Swift 4 แต่ไม่จำเป็นอีกต่อไปในขณะนี้ซึ่งStringเป็นCollectionอีกครั้ง

ตัวอย่างเช่น Swift 4 Stringมีคุณสมบัตินับโดยตรงที่ให้จำนวนตัวอักษร:

// Swift 4
let spString = "Stack"
spString.count           // 5

ตัวอย่างสำหรับ String และ SubString

เชือก

Swift 4 Stringได้รับ Element โดยตรงซึ่งให้ตัวละครตัวแรกของ String:(string.characters.first)

let spString = "Stack"
let firstElement = spString.first   //S

substring

ใช้ SubString รับตัวอักษรตัวแรก

let spstring = "Welcome"
let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
let sub = spstring.substring(to: indexStartOfText)
print(sub) //W

ฉันต้องการรับอักขระตัวแรกของสตริงดังนั้นฉันจึงต้องการทราบว่าฉันควรใช้ let firstElement = spString.first หรือ Substring อย่างไร
Pulkit

1
@Pulkit ดีกว่าที่จะใช้.firstเพราะถ้าสตริง""ว่างเปล่า มันจะคืนค่าศูนย์ แต่substringจะสร้างข้อผิดพลาด
Pranavan Sp

วิธีแปลงบรรทัดของรหัสนี้เป็น swift 4 'AuthorImageText = String (val.characters [(AuthorName.startIndex)]). capitalized'
Pulkit

@Pulkit ลบออก.charactersพอ
Pranavan Sp

0

คุณสามารถใช้รหัสนี้สำหรับการจัดกลุ่มพจนานุกรมโดยไม่ต้องใช้ {$ 0.characters.first! }

let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000]
let groupedCities = Dictionary(grouping: cities.keys) { $0.first! }
print(groupedCities)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.