Dizeyi sıfır ve boş olarak kontrol edin


Yanıtlar:


212

İsteğe bağlı Dizelerle uğraşıyorsanız, bu çalışır:

(string ?? "").isEmpty

??Dışı nil ise nil kaynaştırma operatör aksi takdirde sağ tarafını döner, sol tarafını döner.

Varsayılan bir değer döndürmek için şu şekilde de kullanabilirsiniz:

(string ?? "").isEmpty ? "Default" : string!

3
Zarif ??? Temel olarak "eğer string nil değilse boş string değilse ve o çağrı onun üzerinde boşsa ... Ne mantıklı bir ifade.
Renetik

73

Belki if-let-where cümlesini kullanabilirsiniz:

Swift 3:

if let string = string, !string.isEmpty {
    /* string is not blank */
}

Swift 2:

if let string = string where !string.isEmpty {
    /* string is not blank */
}

2
Swift 2 ile çalışmıyor, bu çalışma zamanı hatasını alıyorum fatal error: unexpectedly found nil while unwrapping an Optional valueama sabitimin stringbir dizi verisi var.
Nagendra Rao

3
Bu Swift 3'te çalışıyor:if let string = string, !string.isEmpty { /* string is not blank */ }
EricS

1
@AmrLotfy guard let, ifadenin altındaki kontrol akışını sonlandırmak istiyorsanız bir alternatiftir. Ancak hiçbir şey (! Boole yadsımayı olan) burada nerede fıkra açıkta ediliyor
Ryan

peki ya bu! str? .isEmpty yerine string = string burada! string.isEmpty
Pankaj

28

Swift 2 kullanıyorsanız, isteğe bağlı Dizelere isNilOrEmpty özelliğini ekleyen iş arkadaşımın bulduğu bir örnek:

protocol OptionalString {}
extension String: OptionalString {}

extension Optional where Wrapped: OptionalString {
    var isNilOrEmpty: Bool {
        return ((self as? String) ?? "").isEmpty
    }
}

Daha sonra isteğe bağlı dizenin kendisinde isNilOrEmpty kullanabilirsiniz

func testNilOrEmpty() {
    let nilString:String? = nil
    XCTAssertTrue(nilString.isNilOrEmpty)

    let emptyString:String? = ""
    XCTAssertTrue(emptyString.isNilOrEmpty)

    let someText:String? = "lorem"
    XCTAssertFalse(someText.isNilOrEmpty)
}

Lütfen burada ne yaptığınızı açıklayabilir misiniz veya bunu ayrıntılı olarak açıklayabilecek bir kaynak olabilir. Gibi neden OptionalString bildirildi? Sözdizimi alamıyorum. Yani normal uzantı uygulaması gibi değil. Şimdiden çok teşekkürler
Vinayak Parmar

@VinayakParmar OptionalString burada beyan edilmiştir çünkü where Wrapped: bir protokol değil, bir protokol belirtmelidir.
Adam Johns

Belki adlandırabilirsiniz isNilOrEmptyiçin hasValuemantığı (veya böyle bir şey) ve ters
İslam S.

28

kullanma guarddeyimi

İfadeyi öğrenmeden önce Swift'i bir süre kullanıyordum guard. Şimdi büyük bir hayranıyım. İfadeye benzer şekilde kullanılır if, ancak erken dönüşe izin verir ve genel olarak çok daha temiz kod sağlar.

Bir dizenin ne boş ne de boş olmadığından emin olmak için kontrol ederken koruma kullanmak için aşağıdakileri yapabilirsiniz:

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ı dizeyi açar ve aynı anda tamamen boş olmadığını kontrol eder. Sıfırsa (veya boşsa), işlevinizden (veya döngüden) hemen dönersiniz ve ondan sonraki her şey yok sayılır. Ancak koruma ifadesi geçerse, sarılmamış dizenizi güvenle kullanabilirsiniz.

Ayrıca bakınız


dikkatli ol. String nil veya boş ise print (myString) çalışmayacaktır, çünkü guard else fazına geldikten sonra düşmeyecek şekilde tasarlanmıştır.
Kang Byul

@KangByul, bu doğru ve buradaki mantığın amacı. Muhtemelen dize nilboşsa veya boşsa, aramak istemeyecektir print(myString). A nilveya boşluğun ardından yürütmeye devam Stringetmeniz gerekirse, if letyerine yerine kullanırsınız guard.
Suragch

Bir övgü için teşekkürler. Biliyorum, sadece korumayı pek bilmeyenlere söylüyorum.
Kang Byul

4
@KangByul "Dikkatli ol" yorumunuzun amacını anlamıyorum, bence insanları harika bir çözümden korkutuyor, geri dönüş ifadesi açıkça başka bir ifadede doğru, yorumunuzu silmeniz gerektiğini düşünüyorum
Brian Ogden

16

Swift 5 ile, isteğe bağlı bir dizenin değeri yoksa veya boşsa dönen bir boole özelliği ile tür Optionaliçin bir uzantı uygulayabilirsiniz String:

extension Optional where Wrapped == String {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

Ancak, protokole uyarak özelliği Stringuygular . Bu nedenle önceki kodun jenerik kısıtlamasını (yerine daha geniş bir birinden (birlikte) ), böylece , ve aynı zamanda yeni yararlanacak özelliği:isEmptyCollectionWrapped == StringWrapped: CollectionArrayDictionarySetisNilOrEmpty

extension Optional where Wrapped: Collection {

    var isNilOrEmpty: Bool {
        return self?.isEmpty ?? true
    }

}

S ile kullanım String:

let optionalString: String? = nil
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = ""
print(optionalString.isNilOrEmpty) // prints: true
let optionalString: String? = "Hello"
print(optionalString.isNilOrEmpty) // prints: false

S ile kullanım Array:

let optionalArray: Array<Int>? = nil
print(optionalArray.isNilOrEmpty) // prints: true
let optionalArray: Array<Int>? = []
print(optionalArray.isNilOrEmpty) // prints: true
let optionalArray: Array<Int>? = [10, 22, 3]
print(optionalArray.isNilOrEmpty) // prints: false

Kaynaklar:


1
Bu gibi, keşke yapacak çimdik onu adlandırmak etmektir isNilOrEmptyiçin isEmptyOrNilotomatik tamamlamada için aynı desen yoluyla kolayca bulunabilmesini yüzden öneki eşleşecek. Birlikte çalıştığım meslektaşların bu şekilde bulmalarından bu uzantının daha fazla benimsendiğini fark ettim.
Aaron

14
var str: String? = nil

if str?.isEmpty ?? true {
    print("str is nil or empty")
}

str = ""

if str?.isEmpty ?? true {
    print("str is nil or empty")
}

1
Zarif ama tuhaf;), "gerçek"
türden ön plana çıkıyor

9

Bu sorunun pek çok cevabı olduğunu biliyorum, ancak bunların hiçbiri (bence) UITextFieldverileri doğrulamak için bu kadar uygun görünmüyor , ki bu onu kullanmak için en yaygın durumlardan biridir:

extension Optional where Wrapped == String {
    var isNilOrEmpty: Bool {
        return self?.trimmingCharacters(in: .whitespaces).isEmpty ?? true
    }
}

Sadece kullanabilirsin

textField.text.isNilOrEmpty

Ayrıca, .trimmingCharacters(in:.whitespaces)beyaz boşlukları boş bir dizge olarak görmüyorsanız atlayabilir veya daha karmaşık girdi testleri için kullanabilirsiniz.

var isValidInput: Bool {
    return !isNilOrEmpty && self!.trimmingCharacters(in: .whitespaces).characters.count >= MIN_CHARS
}

Harika yanıt, Operatör, beyaz boşlukların boş sayıldığı yerlerde kesin değildi, bu yüzden benim sürümüm: public extension İsteğe bağlı, burada Wrapped == String {var isEmptyOrNil: Bool {return (self ?? "") .isEmpty}}
sachadso

7

Ben tavsiye ederim.

if stringA.map(isEmpty) == false {
    println("blah blah")
}

mapisteğe bağlı ise işlev bağımsız değişkenini uygular .Some.
Oyun alanı yakalama, isteğe bağlı bağlama izin verilirse, yeni Swift 1.2 ile başka bir olasılık da gösterir.

görüntü açıklamasını buraya girin


7

Dizeye isteğe bağlı olmayan bir şekilde erişmek istiyorsanız, Ryan'ın Cevabını kullanmalısınız , ancak yalnızca dizenin boş olmamasını önemsiyorsanız, bunun için tercih ettiğim kısaltma şudur:

if stringA?.isEmpty == false {
    ...blah blah
}

Dan beri == isteğe bağlı boolelerde ile çalışır ince, ben orijinal niyeti karıştırmadan bu yaprakları kod okunabilir düşünüyorum.

Tersini kontrol etmek istiyorsanız: eğer dize nilveya ise "", doğru niyeti göstermek için her iki durumu da açıkça kontrol etmeyi tercih ederim:

if stringA == nil || stringA?.isEmpty == true {
    ...blah blah
}

@ TruMan1 doğru, ilk örneğin amacı dizenin boş olup olmadığını kontrol etmektir .
Alex Pretzlav

4

SWIFT 3

extension Optional where Wrapped == String {

    /// Checks to see whether the optional string is nil or empty ("")
    public var isNilOrEmpty: Bool {
        if let text = self, !text.isEmpty { return false }
        return true
    }
}

İsteğe bağlı dizede şu şekilde kullanın:

if myString.isNilOrEmpty { print("Crap, how'd this happen?") } 

4

Swift 3 Boş Dize'yi kontrol etmek için en iyi yol

if !string.isEmpty{

// do stuff

}

2

Çokça yapmayı beklediğiniz bir şeyse, kendi özel işlevinizi oluşturabilirsiniz.

func isBlank (optionalString :String?) -> Bool {
    if let string = optionalString {
        return string.isEmpty
    } else {
        return true
    }
}



var optionalString :String? = nil

if isBlank(optionalString) {
    println("here")
}
else {
    println("there")
}

2

Swift 3 çözümü İsteğe bağlı sarmalanmamış değeri kullanın ve boole ile karşılaştırmayı kontrol edin.

if (string?.isempty == true) {
    // Perform action
}

2

İsEmpty kullanma

"Hello".isEmpty  // false
"".isEmpty       // true

AllSatisfy'i kullanma

extension String {
  var isBlank: Bool {
    return allSatisfy({ $0.isWhitespace })
  }
}

"Hello".isBlank        // false
"".isBlank             // true

İsteğe bağlı Dize kullanma

extension Optional where Wrapped == String {
  var isBlank: Bool {
    return self?.isBlank ?? true
  }
}

var title: String? = nil
title.isBlank            // true
title = ""               
title.isBlank            // true

Referans: https://useyourloaf.com/blog/empty-strings-in-swift/


1

Bir String sınıfı uzantısı oluşturun:

extension String
{   //  returns false if passed string is nil or empty
    static func isNilOrEmpty(_ string:String?) -> Bool
    {   if  string == nil                   { return true }
        return string!.isEmpty
    }
}// extension: String

Dize bir veya daha fazla boşluk içeriyorsa bunun DOĞRU döndüreceğine dikkat edin. Boş dizeyi "boş" olarak değerlendirmek için şunu kullanın ...

return string!.trimmingCharacters(in: CharacterSet.whitespaces).isEmpty

... yerine. Bu, Foundation gerektirir.

Bunu kullanın ...

if String.isNilOrEmpty("hello world") == true 
{   print("it's a string!")
}

1

Swift 3 Bu, dizenin gerçekten boş olup olmadığını kontrol etmek için iyi çalışır. Çünkü isEmpty, bir boşluk olduğunda true değerini döndürür.

extension String {
    func isEmptyAndContainsNoWhitespace() -> Bool {
        guard self.isEmpty, self.trimmingCharacters(in: .whitespaces).isEmpty
            else {
               return false
        }
        return true
    }
}

Örnekler:

let myString = "My String"
myString.isEmptyAndContainsNoWhitespace() // returns false

let myString = ""
myString.isEmptyAndContainsNoWhitespace() // returns true

let myString = " "
myString.isEmptyAndContainsNoWhitespace() // returns false

1

Bunun gibi bir şey yapmalısınız:
if !(string?.isEmpty ?? true) { //Not nil nor empty }

Nil birleştirme operatörü, isteğe bağlı olanın sıfır olup olmadığını kontrol eder, sıfır olmaması durumunda, daha sonra özelliğini kontrol eder, bu durumda isEmpty. Bu isteğe bağlı sıfır olabileceğinden, isteğe bağlı değeriniz sıfır olduğunda kullanılacak varsayılan bir değer sağlarsınız.


1

Bu, Collectionaşağıdakileri içeren protokole uyan tüm türler için genel bir çözümdür String:

extension Optional where Wrapped: Collection {
    var isNilOrEmpty: Bool {
        self?.isEmpty ?? true
    }
}

0

Değerleri yerel db'den sunucuya ve tersi şekilde geçirirken,? 'Ve!' Ler ile çok fazla sorun yaşıyordum.

Bu yüzden boş durumları ele almak için bir Swift3.0 aracı yaptım ve koddaki? 'Ve!' Leri neredeyse tamamen önleyebilirim.

func str(_ string: String?) -> String {
    return (string != nil ? string! : "")
}

Ör: -

Önce :

    let myDictionary: [String: String] = 
                      ["title": (dbObject?.title != nil ? dbObject?.title! : "")]

Sonra:

    let myDictionary: [String: String] = 
                        ["title": str(dbObject.title)]

ve geçerli bir dizenin kontrol edilmesi gerektiğinde,

    if !str(dbObject.title).isEmpty {
        //do stuff
    }

Bu, mantıklı bir şekilde kod yazdıktan sonra çok sayıda? Ve! 'Leri ekleme ve kaldırma zahmetinden kurtulmamı sağladı.


0

Üçlü operatörü kullanın (koşullu operatör olarak da bilinir C++ forever!):

if stringA != nil ? stringA!.isEmpty == false : false { /* ... */ }

stringA!Zorla Unwrapping sadece ne olur stringA != nilgüvenli yani. == falseAyrıntı içinde bir başka ünlem işareti biraz daha okunabilir !(stringA!.isEmpty).

Şahsen biraz farklı bir biçimi tercih ediyorum:

if stringA == nil ? false : stringA!.isEmpty == false { /* ... */ }

Yukarıdaki ifadede, ifbir değişken olduğunda tüm bloğun çalışmadığı hemen çok açıktır nil.


0

UITextField'dan değer alırken ve nil& emptystring'i kontrol ederken faydalıdır

@IBOutlet weak var myTextField: UITextField!

İşte buttonUITextField'den dize alan ve başka şeyler yapan işleviniz (a'ya dokunduğunuzda )

@IBAction func getStringFrom_myTextField(_ sender: Any) {

guard let string = myTextField.text, !(myTextField.text?.isEmpty)!  else { return }
    //use "string" to do your stuff.
}

Bu, dizenin nilyanı sıra değerle de ilgilenecektir empty.

Benim için gayet iyi çalıştı.


0

Bence, sıfır ve boş dizeyi kontrol etmenin en iyi yolu, dizi sayısını almaktır.

var nilString : String?
print(nilString.count) // count is nil

var emptyString = ""
print(emptyString.count) // count is 0

// combine both conditions for optional string variable
if string?.count == nil || string?.count == 0 {
   print("Your string is either empty or nil")
}

-4

bu işlevi kullanabilirsin

 class func stringIsNilOrEmpty(aString: String) -> Bool { return (aString).isEmpty }

2
Hızlı bir kullanıcı değil; nil geçilirse bunun neden bir istisna oluşturmadığını açıklayabilir misiniz?
Foon

nilBu işleve hiçbir şekilde geçemediğiniz için bir istisna oluşturmaz (objc dışında, bu durumda gerçekten çökecektir).
Alfonso

Bu soruya cevap vermiyor. Opsiyonel kabul etmediği için sıfır olup olmadığını kontrol etmez
Wayne Ellery
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.