ตรวจสอบสตริงว่างใน Swift หรือไม่


165

ใน Objective C เราสามารถทำสิ่งต่อไปนี้เพื่อตรวจสอบสตริง:

if ([myString isEqualToString:@""]) {
    NSLog(@"myString IS empty!");
} else {
    NSLog(@"myString IS NOT empty, it is: %@", myString);
}

หนึ่งจะตรวจจับสตริงว่างใน Swift ได้อย่างไร


3
รหัสวัตถุประสงค์ของคุณผิด มันล้มเหลวไม่ดีสำหรับสตริงศูนย์ ในวัตถุประสงค์ C จริง ๆ แล้วใช้: if (myString.length) {'เป็นสตริงที่มีความยาว} ใช้งานได้กับสตริงศูนย์เช่นกัน ง่ายและอ่านง่าย
Tom Andersen

คำตอบ:


241

ขณะนี้มีความสามารถในการตรวจจับสตริงว่างด้วย.isEmpty:

if emptyString.isEmpty {
    print("Nothing to see here")
}

แอปเปิ้ลเอกสารก่อนวางจำหน่าย: "สตริงและตัวอักษร"


1
คุณยังสามารถใช้ isEqualToString ซึ่งมีประโยชน์หากคุณกำลังเริ่มต้น var ด้วย NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven

1
เงื่อนไขนี้ล้มเหลวเมื่อผู้ใช้ป้อนช่องว่าง
Shanu Singh

อัปเดต: นี่คือรายการ
ย่อ

108

วิธีรัดกุมเพื่อตรวจสอบว่าสตริงเป็นศูนย์หรือว่างเปล่าจะเป็น:

var myString: String? = nil

if (myString ?? "").isEmpty {
    print("String is nil or empty")
}

นี่เป็นสิ่งที่สวยงาม แต่คุณจะใช้ค่าที่ไม่ได้เจียระไนได้อย่างไร บังคับแกะหรือไม่
Nostalg.io

5
@halfnibble คุณสามารถทำอย่างใดอย่างหนึ่ง (โดยปริยายหรือถูกบังคับให้แกะ) หรือคุณสามารถทำได้:if let myString = myString where !myString.isEmpty { ... }
อัลเบิร์ต Bori

52

ฉันเขียนคำตอบของฉันอย่างสมบูรณ์ ( อีกครั้ง ) เวลานี้เป็นเพราะฉันได้กลายเป็นแฟนของguardคำสั่งและกลับมาก่อนก่อน มันทำให้รหัสสะอาดมาก

สตริงที่ไม่ใช่ตัวเลือก

ตรวจสอบความยาวเป็นศูนย์

let myString: String = ""

if myString.isEmpty {
    print("String is empty.")
    return // or break, continue, throw
}

// myString is not empty (if this point is reached)
print(myString)

หากว่า ifคำสั่งผ่านไปคุณสามารถใช้สตริงได้อย่างปลอดภัยโดยรู้ว่าไม่ว่างเปล่า ถ้ามันว่างเปล่าฟังก์ชั่นจะกลับมาเร็วและไม่มีอะไรหลังจากมันสำคัญ

สตริงตัวเลือก

ตรวจสอบความยาวศูนย์หรือศูนย์

let myOptionalString: String? = nil

guard let myString = myOptionalString, !myString.isEmpty else {
    print("String is nil or empty.")
    return // or break, continue, throw
}

// myString is neither nil nor empty (if this point is reached)
print(myString)

นี่เป็นการยกเลิกการเลือกและตรวจสอบว่าไม่ว่างเปล่าในเวลาเดียวกัน หลังจากผ่านguardข้อความสั่งนี้คุณสามารถใช้สตริงที่ไม่ได้รับการยกเว้นของคุณได้อย่างปลอดภัย


40

ใน Xcode 11.3 swift 5.2 และใหม่กว่า

ใช้

var isEmpty: Bool { get } 

ตัวอย่าง

let lang = "Swift 5"

if lang.isEmpty {
   print("Empty string")
}

หากคุณต้องการละเว้นช่องว่างสีขาว

if lang.trimmingCharacters(in: .whitespaces).isEmpty {
   print("Empty string")
}

2
มีความแตกต่างระหว่างคำตอบของคุณและข้อยกเว้นหรือไม่?
Ahmad F

วิธีนี้ใช้ไม่ได้หากผู้ใช้ป้อนช่องว่างจำนวนมาก
Supertecnoboff

2
ในการพิมพ์ตัวอักษรช่องว่างได้รับการพิจารณาว่าเป็นตัวละครจึงไม่ว่างเปล่า หากคุณต้องการแล้วสภาพการเปลี่ยนแปลง 'lang.trimmingCharacters (ใน: .whitespaces) .isEmpty'
Saranjith

28

นี่คือวิธีที่ฉันตรวจสอบว่าสตริงว่างเปล่า โดย 'blank' ฉันหมายถึงสตริงที่ว่างเปล่าหรือมีเพียงช่องว่าง / อักขระบรรทัดใหม่

struct MyString {
  static func blank(text: String) -> Bool {
    let trimmed = text.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    return trimmed.isEmpty
  }
}

วิธีใช้:

MyString.blank(" ") // true

7
และเป็นส่วนขยาย ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Daniel Gomez Rico

2
ในฐานะที่เป็นภาคผนวกคุณอาจต้องการพิจารณาใช้ whitespaceAndNewlineCharacterSet แทนที่จะเป็นเพียงช่องว่าง
fwielstra

1
ขอบคุณ @fwielstra การไม่สนใจบรรทัดใหม่จะมีประโยชน์มากเช่นกัน
Evgenii

14

นอกจากนี้คุณยังสามารถใช้ส่วนขยายที่เป็นตัวเลือกเพื่อให้คุณไม่ต้องกังวลเกี่ยวกับการคลายหรือใช้== true:

extension String {
    var isBlank: Bool {
        return self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty
    }
}
extension Optional where Wrapped == String {
    var isBlank: Bool {
        if let unwrapped = self {
            return unwrapped.isBlank
        } else {
            return true
        }
    }
}

หมายเหตุ: เมื่อโทรหาตัวเลือกนี้ตรวจสอบให้แน่ใจว่าจะไม่ใช้งาน?มิฉะนั้นจะยังคงต้องเปิดใช้งานอีกครั้ง


1
ตื่นเต้นกับสิ่งนี้ แต่มันใช้งานไม่ได้ :( ฉันใช้ Swift 3.0
teradyl

@teradyl โดย "ไม่ทำงาน" หมายความว่าคุณได้รับข้อผิดพลาดมีปัญหาเกี่ยวกับการเติมข้อความอัตโนมัติหรืออย่างอื่นใช่ไหม มันควรจะทำงานได้เว้นแต่มีบางสิ่งเปลี่ยนแปลงที่ฉันไม่ทราบ แต่การเติมข้อความอัตโนมัติจะไม่เลือกรุ่นที่ถูกต้องเสมอไป
John Montgomery

ในขณะที่ฉันยังคงได้รับข้อผิดพลาดในการรวบรวมเวลาเมื่อฉันพยายามที่จะใช้optionalString?isBlankมันจะต้องได้รับการปลด
teradyl

1
currentIncident.priority?.description.isBlankสำหรับฉันนี้ไม่ได้ทำงานกับ พูดว่า: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. ฉันต้องทำ(currentIncident.priority?.description ?? "").isBlankซึ่งทำให้ส่วนขยาย sorta ไม่มีจุดหมาย สวิฟท์ 4.1
Carsten Hagemann

1
@CarstenHagemann นั่นเป็นเพราะpriorityตัวเลือกนั่น ถ้าdescriptionเป็นเพียงตัวเลือกมันจะใช้ได้ แต่คุณไม่สามารถแก้ไขวัตถุพาเรนต์ที่เป็นตัวเลือกเช่นนั้นได้ (เพราะถ้าpriorityเป็นศูนย์ดังนั้นมันจึงไม่มีdescriptionคุณสมบัติในการตรวจสอบ blank-ness ในตอนแรก)
John Montgomery

9

เพื่อทำการตรวจสอบศูนย์และความยาวพร้อมกัน Swift 2.0 และ iOS 9 เป็นต้นไปคุณสามารถใช้

if(yourString?.characters.count > 0){}

4

isEmpty จะทำตามที่คุณคิดว่ามันจะเป็นจริงถ้า string == "" มันจะคืนค่าจริง คำตอบอื่น ๆ บางข้อชี้ไปที่สถานการณ์ที่คุณมีสตริงที่เป็นทางเลือก

โปรดใช้การผูกมัดเสริม !!!!

หากสตริงไม่ใช่ศูนย์ isEmpty จะถูกใช้มิฉะนั้นจะไม่มี

ด้านล่างสตริงตัวเลือกจะไม่ถูกตั้งค่าเนื่องจากสตริงเป็นศูนย์

let optionalString: String? = nil
if optionalString?.isEmpty == true {
     optionalString = "Lorem ipsum dolor sit amet"
}

เห็นได้ชัดว่าคุณจะไม่ใช้รหัสข้างต้น กำไรมาจากการแยกวิเคราะห์ JSON หรือสถานการณ์อื่น ๆ ที่คุณมีค่าหรือไม่ รหัสรับประกันนี้จะทำงานหากมีค่า


2

ตรวจสอบการเว้นวรรคและอักขระบรรทัดใหม่ในข้อความ

extension String
{
    var  isBlank:Bool {
        return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).isEmpty
    }
}

การใช้

if text.isBlank
{
  //text is blank do smth
}

1

สำหรับสตริงที่เป็นตัวเลือกวิธีการเกี่ยวกับ:

if let string = string where !string.isEmpty
{
    print(string)
}



0

ฉันสามารถแนะนำเพิ่มส่วนขยายขนาดเล็กให้กับ String หรือ Array ที่ดูเหมือน

extension Collection {
    public var isNotEmpty: Bool {
        return !self.isEmpty
    }
}

ด้วยคุณสามารถเขียนรหัสที่อ่านง่ายขึ้น เปรียบเทียบสองบรรทัดนี้

if !someObject.someParam.someSubParam.someString.isEmpty {}

และ

if someObject.someParam.someSubParam.someString.isNotEmpty {}

มันง่ายที่จะพลาด! ลงชื่อเข้าใช้ที่จุดเริ่มต้นของบรรทัดกำปั้น


0

คุณสามารถใช้ส่วนขยายนี้:

extension String {

    static func isNilOrEmpty(string: String?) -> Bool {
        guard let value = string else { return true }

        return value.trimmingCharacters(in: .whitespaces).isEmpty
    }

}

แล้วใช้แบบนี้:

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