Kiểm tra chuỗi rỗng trong Swift?


165

Trong Mục tiêu C, người ta có thể làm như sau để kiểm tra các chuỗi:

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

Làm thế nào để phát hiện các chuỗi trống trong Swift?


3
Mã mục tiêu của bạn là sai. Nó thất bại nặng nề cho chuỗi nil. Trong mục tiêu C người ta thực sự sử dụng: if (myString.length) {'đó là một chuỗi có độ dài}. Điều này hoạt động trên chuỗi nil là tốt. Điều đó đơn giản và dễ đọc.
Tom Andersen

Câu trả lời:


240

Hiện tại có khả năng tích hợp để phát hiện chuỗi rỗng với .isEmpty:

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

Tài liệu phát hành trước của Apple: "Chuỗi và ký tự" .


1
Bạn cũng có thể sử dụng isEqualToString, rất hữu ích nếu bạn đang khởi tạo var bằng NSString ('var blankString: NSString'): blankString.isEqualToString ("")
Sven

1
tình trạng này không thành công khi người dùng nhập không gian.
Shanu Singh

Cập nhật: Đây
làEmpty

108

Một cách ngắn gọn để kiểm tra xem chuỗi có phải là 0 hay không sẽ là:

var myString: String? = nil

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

Điều này là đẹp, nhưng làm thế nào bạn sẽ sử dụng giá trị chưa mở? Buộc cởi trói?
Nỗi nhớ.io

5
@halfnibble Bạn có thể làm một trong hai (ngầm định hoặc bị ép buộc) hoặc bạn có thể làm:if let myString = myString where !myString.isEmpty { ... }
Albert Bori

52

Tôi hoàn toàn viết lại câu trả lời của mình ( một lần nữa ). Lần này là vì tôi đã trở thành một người hâm mộ của guardtuyên bốtrở lại sớm . Nó làm cho mã sạch hơn nhiều.

Chuỗi không tùy chọn

Kiểm tra độ dài bằng không.

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)

Nếu ifcâu lệnh đi qua, thì bạn có thể sử dụng chuỗi một cách an toàn khi biết rằng nó không trống. Nếu nó trống thì hàm sẽ quay lại sớm và không có gì sau khi nó quan trọng.

Chuỗi tùy chọn

Kiểm tra độ dài bằng không hoặc bằng không.

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)

Điều này hủy bỏ tùy chọn và kiểm tra rằng nó không trống cùng một lúc. Sau khi vượt qua guardcâu lệnh, bạn có thể sử dụng chuỗi nonempty chưa mở của mình một cách an toàn.


40

Trong Xcode 11.3 swift 5.2 trở lên

Sử dụng

var isEmpty: Bool { get } 

Thí dụ

let lang = "Swift 5"

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

Nếu bạn muốn bỏ qua khoảng trắng

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

2
Có sự khác biệt giữa câu trả lời của bạn và câu trả lời không?
Ahmad F

Điều này không hoạt động nếu người dùng chỉ cần vào một loạt các không gian.
Supertecnoboff

2
Trong typography khoảng trắng được coi là một ký tự để nó không trống. Nếu bạn muốn thì hãy thay đổi điều kiện thành 'lang.trimmingChar character (in: .whitespaces) .isEmpty'
Saranjith 28/03/18

28

Đây là cách tôi kiểm tra nếu chuỗi trống. Bởi 'trống' Tôi có nghĩa là một chuỗi trống hoặc chỉ chứa các ký tự khoảng trắng / dòng mới.

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

Cách sử dụng:

MyString.blank(" ") // true


2
Là một phụ lục, bạn có thể muốn xem xét sử dụng khoảng trắngAndNewlineCharacterset thay vì chỉ khoảng trắng.
fwielstra

1
cảm ơn @fwielstra, bỏ qua các dòng mới cũng sẽ rất hữu ích.
Evgenii

14

Bạn cũng có thể sử dụng tiện ích mở rộng tùy chọn để bạn không phải lo lắng về việc hủy kết nối hoặc sử dụng == 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
        }
    }
}

Lưu ý: khi gọi tùy chọn này trên một tùy chọn, hãy đảm bảo không sử dụng ?nếu không nó vẫn sẽ yêu cầu hủy ghép nối.


1
Rất phấn khích về điều này, nhưng nó không hoạt động :( Tôi đang dùng Swift 3.0
teradyl

@teradyl Bởi "không hoạt động", bạn có nghĩa là bạn đang gặp lỗi, gặp sự cố với tự động hoàn thành hoặc điều gì khác? Nó sẽ hoạt động trừ khi có gì đó thay đổi mà tôi không biết, nhưng tự động hoàn thành sẽ không luôn chọn đúng phiên bản.
John Montgomery

Như trong tôi vẫn nhận được một lỗi thời gian biên dịch khi tôi cố gắng sử dụng optionalString?isBlanknó cần phải được mở khóa.
teradyl

1
Đối với tôi, điều này không làm việc với currentIncident.priority?.description.isBlank. Nói : Value of optional type 'Bool?' not unwrapped; did you mean to use '!' or '?'?. Tôi phải làm điều (currentIncident.priority?.description ?? "").isBlankđó làm cho các phần mở rộng trở nên vô nghĩa. Swift 4.1.
Carsten Hagemann

1
@CarstenHagemann Đó là vì prioritylà tùy chọn ở đó. Nếu chỉ descriptionlà tùy chọn, nó sẽ hoạt động, nhưng bạn không thể làm việc xung quanh một đối tượng cha là tùy chọn như vậy (vì nếu prioritykhông, thì nó thậm chí không có thuộc descriptiontính để kiểm tra trạng thái trống ở vị trí đầu tiên).
John Montgomery

9

Để thực hiện kiểm tra và độ dài không đồng thời Swift 2.0 và iOS 9 trở đi, bạn có thể sử dụng

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

4

isEmpty sẽ làm như bạn nghĩ, nếu chuỗi == "", nó sẽ trả về đúng. Một số câu trả lời khác chỉ ra một tình huống trong đó bạn có một chuỗi tùy chọn.

VUI LÒNG sử dụng Chaining tùy chọn !!!!

Nếu chuỗi không bằng 0, isEmpty sẽ được sử dụng, nếu không thì không.

Dưới đây, tùy chọnString sẽ KHÔNG được đặt vì chuỗi không

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

Rõ ràng là bạn sẽ không sử dụng đoạn mã trên. Lợi ích đến từ phân tích cú pháp JSON hoặc các tình huống khác như vậy trong đó bạn có giá trị hay không. Mã đảm bảo này sẽ được chạy nếu có giá trị.


2

Kiểm tra chỉ kiểm tra khoảng trắng và ký tự dòng mới trong văn bản

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

sử dụng

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

1

Đối với Chuỗi tùy chọn, làm thế nào về:

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


0

Thế còn

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

Tôi có thể khuyên bạn nên thêm phần mở rộng nhỏ vào Chuỗi hoặc Mảng trông giống như

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

Với nó, bạn có thể viết mã dễ đọc hơn. So sánh hai dòng này

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

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

Nó rất dễ bỏ lỡ ! ký vào đầu dòng nắm tay.


0

Bạn có thể sử dụng tiện ích mở rộng này:

extension String {

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

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

}

và sau đó sử dụng nó như thế này:

let isMyStringEmptyOrNil = String.isNilOrEmpty(string: myString)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.