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?

chrisjlee
sumber
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" .

chrisjlee
sumber
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")
}
Albert Bori
sumber
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.

Suragch
sumber
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")
}
Saranjith
sumber
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
Evgenii
sumber
7
Dan sebagai perpanjangan ... gist.github.com/danielgomezrico/f852114508c1cfaaa849
Daniel Gomez Rico
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.

John Montgomery
sumber
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){}
MadNik
sumber
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.

Dengan cepat
sumber
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
}
UnRewa
sumber
1

Untuk String opsional, bagaimana dengan:

if let string = string where !string.isEmpty
{
    print(string)
}
PiXeL16
sumber
1
if myString?.startIndex != myString?.endIndex {}
Tukang es
sumber
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")
}
Jerome Chan Yeow Heong
sumber
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.

moonvader
sumber
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)
rgreso
sumber