Periksa string kosong di Swift?


165

Di Objective C, seseorang dapat melakukan hal berikut untuk memeriksa string:

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

Bagaimana cara mendeteksi string kosong di Swift?


3
Kode objektif Anda salah. Gagal buruk untuk string nihil. Dalam objektif C satu benar-benar menggunakan: if (myString.length) {'nya string dengan panjang}. Ini bekerja pada string nil juga. Itu sederhana dan mudah dibaca.
Tom Andersen

Jawaban:


240

Sekarang ada kemampuan bawaan untuk mendeteksi string kosong dengan .isEmpty:

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

Dokumentasi pra-rilis Apple: "Strings and Characters" .


1
Anda juga dapat menggunakan isEqualToString, yang berguna jika Anda menginisialisasi var dengan NSString ('var emptyString: NSString'): emptyString.isEqualToString ("")
Sven

1
kondisi ini gagal ketika pengguna memasukkan spasi.
Shanu Singh


108

Cara ringkas untuk memeriksa apakah string kosong atau kosong adalah:

var myString: String? = nil

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

Ini indah, tetapi bagaimana Anda akan menggunakan nilai yang terbuka? Paksa membuka bungkus?
Nostalg.io

5
@halfnibble Anda dapat melakukan (secara implisit atau paksa membuka) atau Anda dapat melakukan:if let myString = myString where !myString.isEmpty { ... }
Albert Bori

52

Saya sepenuhnya menulis ulang jawaban saya ( lagi ). Kali ini karena saya telah menjadi penggemar guardpernyataan itu dan kembali lebih awal . Itu membuat kode lebih bersih.

String Non-Opsional

Periksa panjang nol.

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)

Jika ifpernyataan itu lewat, maka Anda dapat menggunakan string dengan aman karena tahu itu tidak kosong. Jika kosong maka fungsi akan kembali lebih awal dan tidak ada yang penting.

String opsional

Periksa panjang nol atau nol.

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)

Ini membuka bungkus opsional dan memeriksa bahwa itu tidak kosong pada saat yang sama. Setelah melewati guardpernyataan tersebut, Anda dapat menggunakan string nonempty yang belum dibuka dengan aman.


40

Dalam Xcode 11.3 cepat 5.2 dan yang lebih baru

Menggunakan

var isEmpty: Bool { get } 

Contoh

let lang = "Swift 5"

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

Jika Anda ingin mengabaikan spasi putih

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

2
Apakah ada perbedaan antara jawaban Anda dan yang dikecualikan?
Ahmad F

Ini tidak berfungsi jika pengguna hanya memasukkan banyak ruang.
Supertecnoboff

2
Dalam tipografi spasi putih dianggap sebagai karakter sehingga tidak kosong. Jika Anda mau, ubah kondisi menjadi 'lang.trimmingCharacters (in: .whitespaces) .isEmpty'
Saranjith

28

Inilah cara saya memeriksa apakah string kosong. Dengan 'blank' maksud saya string yang kosong atau hanya berisi spasi / karakter baris baru.

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

Cara Penggunaan:

MyString.blank(" ") // true


2
Sebagai tambahan, Anda mungkin ingin mempertimbangkan untuk menggunakan whitespaceAndNewlineCharacterSet, bukan hanya whitespace.
fwielstra

1
terima kasih @fwielstra, mengabaikan baris baru juga akan sangat berguna.
Evgenii

14

Anda juga dapat menggunakan ekstensi opsional sehingga Anda tidak perlu khawatir tentang membuka atau menggunakan == 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
        }
    }
}

Catatan: saat memanggil ini pada opsional, pastikan untuk tidak menggunakan ?atau yang lain masih akan membutuhkan pembungkus.


1
Senang dengan ini, tetapi tidak berhasil :( Saya menggunakan Swift 3.0
teradyl

@teradyl Dengan "tidak berhasil," maksud Anda Anda mendapatkan kesalahan, mengalami masalah dengan pelengkapan otomatis, atau hal lain? Ini seharusnya berfungsi kecuali ada sesuatu yang berubah yang tidak saya sadari, tetapi pelengkapan otomatis tidak akan selalu memilih versi yang tepat.
John Montgomery

Seperti dalam saya masih mendapatkan kesalahan waktu kompilasi ketika saya mencoba menggunakannya optionalString?isBlankbahwa itu harus dibuka.
teradyl

1
Bagi saya, ini tidak berhasil currentIncident.priority?.description.isBlank. Says: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Saya harus melakukan (currentIncident.priority?.description ?? "").isBlankyang membuat ekstensi agak tidak berguna. Cepat 4.1.
Carsten Hagemann

1
@CarstenHagemann Itu karena priorityada pilihan di sana. Kalau saja descriptionopsional itu akan bekerja, tetapi Anda tidak dapat bekerja di sekitar objek induk menjadi opsional seperti itu (karena jika prioritynihil, maka itu bahkan tidak memiliki descriptionproperti untuk memeriksa kekosongan di tempat pertama).
John Montgomery

9

Untuk melakukan nil check dan length secara bersamaan Swift 2.0 dan iOS 9 dan seterusnya dapat Anda gunakan

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

4

isEmpty akan melakukan apa yang Anda pikirkan, jika string == "", itu akan mengembalikan true. Beberapa jawaban lain menunjuk pada situasi di mana Anda memiliki string opsional.

HARAP gunakan Chaining Opsional !!!!

Jika string tidak nil, isEmpty akan digunakan, jika tidak maka tidak akan.

Di bawah ini, opsionalString TIDAK akan diatur karena string adalah nihil

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

Jelas Anda tidak akan menggunakan kode di atas. Keuntungan berasal dari penguraian JSON atau situasi lain di mana Anda memiliki nilai atau tidak. Kode jaminan ini akan dijalankan jika ada nilai.


2

Periksa periksa hanya spasi dan baris baru karakter dalam teks

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

menggunakan

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

1

Untuk String opsional, bagaimana dengan:

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


0

Bagaimana dengan

if let notEmptyString = optionalString where !notEmptyString.isEmpty {
    // do something with emptyString 
    NSLog("Non-empty string is %@", notEmptyString)
} else {
    // empty or nil string
    NSLog("Empty or nil string")
}

0

Saya dapat merekomendasikan menambahkan ekstensi kecil ke String atau Array yang terlihat seperti

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

Dengannya Anda dapat menulis kode yang lebih mudah dibaca. Bandingkan dua baris ini

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

dan

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

Sangat mudah untuk dilewatkan ! masuk di awal garis tinju.


0

Anda dapat menggunakan ekstensi ini:

extension String {

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

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

}

dan kemudian gunakan seperti ini:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.