Swift'teki boş dize kontrol edilsin mi?


165

Amaç C'de, dizeleri kontrol etmek için aşağıdakiler yapılabilir:

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

Swift'teki boş dizeleri nasıl algılar?


3
Hedef kodunuz yanlış. Nil dizeleri için kötü başarısız. Hedef C'de gerçekte şunlar kullanılır: if (myString.length) {'uzunluklu bir dize}. Bu nil dizgiler üzerinde de çalışır. Bu basit ve okunması kolay.
Tom Andersen

Yanıtlar:


241

Artık boş dizeyi aşağıdakilerle algılama yeteneği vardır .isEmpty:

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

Apple Sürüm öncesi belgeler: "Dizeler ve Karakterler" .


1
Var'ı NSString ('var emptyString: NSString') ile başlatırsanız kullanışlı olan isEqualToString'i de kullanabilirsiniz: emptyString.isEqualToString ("")
Sven

1
kullanıcı boşluk girdiğinde bu koşul başarısız olur.
Shanu Singh


108

Dizenin sıfır veya boş olup olmadığını kontrol etmenin kısa bir yolu:

var myString: String? = nil

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

Bu güzel, ama açılmamış değeri nasıl kullanırdınız? Çözmeyi zorla?
Nostalg.io

5
@halfnibble Şunları yapabilirsiniz (örtük veya zorla açma) veya şunları yapabilirsiniz:if let myString = myString where !myString.isEmpty { ... }
Albert Bori

52

Cevabımı tamamen yeniden yazıyorum ( tekrar ). Bu kez çünkü guardaçıklama ve erken dönüş hayranı oldum . Çok daha temiz bir kod sağlar.

İsteğe Bağlı Olmayan Dize

Sıfır uzunluğunu kontrol edin.

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)

Eğer ifdeyimi geçer, o zaman güvenli bir şekilde onu boş olmadığını bilerek dizesi kullanabilirsiniz. Boşsa, işlev erken dönecektir ve önemli olduktan sonra hiçbir şey olmayacaktır.

İsteğe Bağlı Dize

Sıfır veya sıfır uzunluk için kontrol edin.

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)

Bu, isteğe bağlı paketi açar ve aynı anda boş olup olmadığını kontrol eder. İfadeyi geçtikten sonra guard, paketlenmemiş boş olmayan dizenizi güvenle kullanabilirsiniz.


40

Xcode 11.3'te hızlı 5.2 ve üstü

kullanım

var isEmpty: Bool { get } 

Misal

let lang = "Swift 5"

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

Beyaz boşlukları yok saymak istiyorsanız

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

2
Cevabınız ile istisna cevap arasında bir fark var mı?
Ahmad F

Kullanıcı bir grup boşluğa girerse bu işe yaramaz.
Supertecnoboff

2
Tipografide beyaz alanlar bir karakter olarak kabul edilir, bu yüzden boş değildir. : Eğer '.isEmpty (.whitespaces olarak) lang.trimmingCharacters' sonra değişiklik koşulunu istiyorsanız
Saranjith

28

Dize boş olup olmadığını nasıl kontrol ederim. 'Blank' ile boş ya da yalnızca boşluk / satırsonu karakterleri içeren bir dize kastediyorum.

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

Nasıl kullanılır:

MyString.blank(" ") // true


2
Ek olarak, yalnızca boşluk yerine whitespaceAndNewlineCharacterSet öğesini kullanmayı düşünebilirsiniz.
fwielstra

1
teşekkürler @fwielstra, yeni satırları görmezden gelmek de çok yararlı olacaktır.
Evgenii

14

İsteğe bağlı bir uzantı da kullanabilirsiniz, böylece paketin açılması veya kullanılması konusunda endişelenmenize gerek kalmaz == 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
        }
    }
}

Not: Bunu isteğe bağlı olarak çağırırken, kullanmamaya dikkat ?edin, aksi takdirde yine de paketin açılması gerekir.


1
Bu konuda heyecanlandım, ama işe yaramadı :( Swift
3.0'dayım

@teradyl "İşe yaramadı" derken bir hata alıyorsunuz, otomatik tamamlama ile ilgili sorunlarınız mı var veya başka bir şey mi? Farkında olmadığım bir şey değişmedikçe çalışmalıdır, ancak otomatik tamamlama her zaman doğru sürümü seçmez.
John Montgomery

optionalString?isBlankİçinde olduğu gibi hala açılmaması gereken kullanmaya çalıştığımda derleme zamanı hatası alıyorum .
teradyl

1
Benim için bu işe yaramıyor currentIncident.priority?.description.isBlank. Diyor: Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Yapmam gereken (currentIncident.priority?.description ?? "").isBlankuzantıları sorta anlamsız kılıyor. Hızlı 4.1.
Carsten Hagemann

1
@CarstenHagemann Çünkü priorityorada isteğe bağlıdır. Sadece descriptionisteğe bağlı olsaydı, işe yarayacaktı, ancak böyle bir isteğe bağlı bir üst nesnenin etrafında çalışamazsınız (çünkü prioritynil descriptionise, ilk etapta boşluğu kontrol etmek için bir özelliğe bile sahip değildir ).
John Montgomery

9

Nil kontrolü ve uzunluğunu aynı anda yapmak için Swift 2.0 ve iOS 9'dan itibaren kullanabilirsiniz

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

4

isEmpty düşündüğünüz gibi yapacak, eğer string == "" ise true değerini döndürecektir. Diğer yanıtlardan bazıları isteğe bağlı bir dizenin olduğu bir duruma işaret eder.

LÜTFEN İsteğe Bağlı Zincirleme kullanın !!!!

Dize nil değilse, isEmpty kullanılır, aksi takdirde kullanılmaz.

Aşağıda, string nil olduğu için OptionalString ayarlanmayacak

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

Açıkçası yukarıdaki kodu kullanmazsınız. Kazançlar, JSON ayrıştırma işleminden veya bir değerin olduğu veya bulunmadığı diğer durumlardan gelir. Bu bir değer varsa kodun çalıştırılacağını garanti eder.


2

Yalnızca metindeki boşlukları ve satırsonu karakterlerini kontrol edin

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

kullanma

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

1

İsteğe bağlı Dizeler için aşağıdakiler hakkında bilgi:

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

1
if myString?.startIndex != myString?.endIndex {}

0

Ne dersin

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

Dize veya Diziye benzeyen küçük bir uzantı eklemenizi tavsiye ederim

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

Bununla birlikte, okunması daha kolay bir kod yazabilirsiniz. Bu iki satırı karşılaştır

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

ve

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

Kaçırmak kolaydır ! işareti yumruk işareti başında.


0

Bu uzantıyı kullanabilirsiniz:

extension String {

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

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

}

ve sonra şu şekilde kullanın:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.