nil & empty의 문자열 확인


134

에 대한 문자열을 확인 할 수있는 방법이 있나요 nil및 ""스위프트의는? Rails에서는 blank()확인할 수 있습니다 .

나는 현재 이것을 가지고 있지만 과잉 것 같습니다 :

    if stringA? != nil {
        if !stringA!.isEmpty {
            ...blah blah
        }
    }

1
줄 바꿈 문자열
— rintaro

1
(@sutra 및 @ imanou-petit)의 답변이 더 좋습니다.
— Ming Mr.

답변:


211

선택적 문자열을 다루는 경우 다음과 같이 작동합니다.

(string ?? "").isEmpty

??는 비 전무의 경우 전무 병합 연산자 그렇지 않으면 오른쪽을 반환 왼쪽을 반환합니다.

다음과 같이 사용하여 기본값을 반환 할 수도 있습니다.

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

3
우아한 ??? 당신은 기본적으로 "문자열이 없으면 빈 문자열이 아니고 그 호출이 비어 있다면 ... 논리적 인 진술입니다.
— Renetik

73

if-let-where 절을 사용할 수 있습니다.

스위프트 3 :

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

스위프트 2 :

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

2
Swift 2에서 작동하지 않으므로이 런타임 오류가 발생 fatal error: unexpectedly found nil while unwrapping an Optional value하지만 상수 string에는 문자열 데이터가 있습니다.
— Nagendra Rao

3
이것은 스위프트 3에서 작동합니다if let string = string, !string.isEmpty { /* string is not blank */ }
— EricS

1
guard let명령문 아래에서 제어 플로우를 종료하려는 경우 @AmrLotfy 가 대안입니다. 그러나 where 절에서 아무것도 풀리지 않습니다 (!는 부울 부정입니다)
— Ryan

그래서 어떻게 STR에 대한 .isEmpty 대신 문자열 = 문자열의 경우 string.isEmpty!에?!
— 판 카즈

28

Swift 2를 사용하는 경우 다음은 내 동료가 제시 한 예제이며 선택적 문자열에 isNilOrEmpty 속성을 추가합니다.

protocol OptionalString {}
extension String: OptionalString {}

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

그런 다음 선택적 문자열 자체에서 isNilOrEmpty를 사용할 수 있습니다

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

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

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

여기서 무엇을했는지 또는이를 자세히 설명 할 수있는 자료를 설명해 주시겠습니까? OptionalString이 선언 된 이유와 같이? 구문이 표시되지 않습니다. 그것은 정상적인 확장 구현과 다릅니다. 미리 감사드립니다
— Vinayak Parmar

@VinayakParmar OptionalString은 where Wrapped:유형이 아닌 프로토콜을 지정해야 하므로 여기에 선언됩니다 .
— Adam Johns

어쩌면 당신은 (또는 이와 비슷한) 이름 isNilOrEmpty을 hasValue
— 이슬람교 Q.

28

guard진술 사용

나는 guard진술 에 대해 배우기 전에 잠시 동안 Swift를 사용하고있었습니다 . 지금 나는 큰 팬입니다. if명령문 과 유사하게 사용 되지만 조기 리턴을 허용 하고 일반적으로 훨씬 깨끗한 코드를 만듭니다.

문자열이 0이 아니거나 비어 있지 않은지 확인할 때 guard를 사용하려면 다음을 수행하십시오.

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)

옵션 문자열을 풀고 한 번에 비어 있지 않은지 확인합니다. 그것이 0이거나 비어 있다면, 즉시 함수 (또는 루프)에서 돌아오고 그 이후의 모든 것이 무시됩니다. 그러나 guard 문이 통과하면 래핑되지 않은 문자열을 안전하게 사용할 수 있습니다.

또한보십시오


조심해. 가드가 다른 단계로 들어간 후에 떨어지지 않도록 설계되었으므로 문자열이 nil이거나 비어 있으면 print (myString)이 실행되지 않습니다.
— Kang Byul

@ KangByul, 맞습니다. 논리의 의도입니다. 문자열이 nil비어 있거나 비어 있으면을 호출하지 않을 것 print(myString)입니다. 당신이 후 실행을 계속하기 위해 필요한 경우 nil나 비어 String, 당신은 사용하는 것 if let보다는 guard.
— Suragch

칭찬 해 주셔서 감사합니다. 알아, 난 그냥 경비에 대해 잘 모르는 다른 사람들에게 말해
— Kang Byul

4
@KangByul 나는 당신의 "주의"의견의 요점을 이해하지 못하고, 내가, return 문은 오른쪽 가드 다른 성명에서 분명히 그것은 훌륭한 솔루션에서 떨어져 사람을 무서워 생각, 나는 당신이 당신의 코멘트를 삭제해야한다고 생각
— 브라이언 오그 덴

16

Swift 5를 사용하면 선택적 문자열에 값이 없거나 비어있는 경우를 반환하는 부울 속성을 사용하여 유형에 대한 Optional확장을 구현할 수 있습니다 String.

extension Optional where Wrapped == String {

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

}

그러나 protocol을 준수하여 속성을 String구현 isEmpty합니다 Collection. 그러므로 우리는 이전 코드의 일반적인 제약 (대체 할 수있는 Wrapped == String폭 넓은 하나 (과) Wrapped: Collection) 그래서 Array, Dictionary그리고 Set또한 우리의 새로운 혜택 isNilOrEmpty속성을 :

extension Optional where Wrapped: Collection {

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

}

Strings를 사용한 사용법 :

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

Arrays를 사용한 사용법 :

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

출처 :


1
이런 내가는 단지 내가 만들 것 조정할에서 이름을 변경하는 것입니다 isNilOrEmpty에 isEmptyOrNil가 자동 완성에 대해 동일한 패턴을 통해 쉽게 검색 가능 그래서 접두사와 일치하는. 나는이 방법으로 찾은 동료들로부터이 확장 기능을 더 많이 채택한 것을 알았습니다.
— 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
우아하지만 어색한;), "진정한"종류는 직감을 버립니다
— TruMan1

9

나는이 질문에 대한 많은 답변이 있다는 것을 알고 있지만 UITextField, 데이터 를 확인하는 데 (이것은 내 의견으로는) 편리한 것 같지 않습니다.이를 사용하는 가장 일반적인 경우 중 하나입니다.

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

당신은 그냥 사용할 수 있습니다

textField.text.isNilOrEmpty

또한를 건너 뛸 수 있습니다 .trimmingCharacters(in:.whitespaces)당신은 빈 문자열로 공백을 고려하거나 같은 더 복잡한 입력 테스트를 위해 그것을 사용하지 않는 경우

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

대답은 공백으로 계산 된 공백이 여기에 내 버전 인 경우 Op가 정확하지 않은 것입니다. public extension Optional where Wrapped == String {var isEmptyOrNil : Bool {return (self ?? "") .isEmpty}}
— sachadso

7

나는 추천 할 것입니다.

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

map선택 사항이이면 함수 인수를 적용합니다 .Some.
운동장 캡처는 새로운 Swift 1.2를 통해 또 다른 가능성을 보여줍니다.

여기에 이미지 설명을 입력하십시오


7

선택 사항이 아닌 문자열에 액세스하려면 Ryan의 답변을 사용해야 하지만 문자열의 비어 있지 않은 부분 만 신경 쓰면 선호하는 속기입니다.

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

==선택적 부울에서 잘 작동 하므로 원래 의도를 방해하지 않으면 서 코드를 읽을 수 있다고 생각합니다.

반대로 확인하려면 : 문자열이 nil또는 ""인 경우 올바른 의도를 표시하기 위해 두 경우를 명시 적으로 확인하는 것이 좋습니다 .

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

@ TruMan1 맞습니다. 첫 번째 예의 목표는 문자열이 비어 있지 않은지 확인하는 것 입니다.
— Alex Pretzlav

4

스위프트 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
    }
}

선택적 문자열에서 다음과 같이 사용하십시오.

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

4

스위프트 3 빈 문자열을 확인하는 가장 좋은 방법

if !string.isEmpty{

// do stuff

}

2

많은 기능을 수행 할 것으로 예상되는 경우 사용자 정의 함수를 작성할 수 있습니다.

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

스위프트 3 솔루션 옵션으로 래핑되지 않은 값을 사용하고 부울 값을 확인하십시오.

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

2

isEmpty 사용

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

allSatisfy 사용

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

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

선택적 문자열 사용

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

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

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


1

문자열 클래스 확장을 작성하십시오.

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

문자열에 공백이 하나 이상 있으면 TRUE를 반환합니다. 빈 문자열을 "빈"것으로 취급하려면 다음을 사용하십시오.

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

... 대신. 이것은 재단이 필요합니다.

이렇게 사용하십시오 ...

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

1

Swift 3 문자열이 실제로 비어 있는지 확인하는 데 효과적입니다. 공백이 있으면 isEmpty가 true를 리턴하기 때문입니다.

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

예 :

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

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

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

1

다음과 같이해야합니다.
if !(string?.isEmpty ?? true) { //Not nil nor empty }

Nil 통합 연산자는 옵션이 nil이 아닌지 확인하고, nil이 아닌 경우 속성을 확인합니다 (이 경우 isEmpty). 이 선택 사항이 nil 일 수 있으므로 선택 사항이 nil 일 때 사용되는 기본값을 제공합니다.


1

Collection프로토콜 을 준수하는 모든 유형에 대한 일반적인 솔루션 이며 다음을 포함합니다 String.

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

0

로컬 DB에서 서버로 또는 그 반대로 값을 전달할 때?와!에 너무 많은 문제가있었습니다.

그래서 null 사례를 처리하기 위해 Swift3.0 유틸리티를 만들었으며 코드에서?와!를 거의 완전히 피할 수 있습니다.

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

전의:-

전 :

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

후 :

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

유효한 문자열을 확인해야 할 때

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

이것은 합리적으로 이해되는 코드를 작성한 후에 수많은?와!를 추가하고 제거하는 문제를 해결해야했습니다.


0

삼항 연산자 (조건부 연산자라고도 함 C++ forever!)를 사용하십시오.

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

stringA!힘 랩핑 해제는 경우에만 일어나는 stringA != nil것이 안전하므로. == false상세는 또 다른 느낌표에 비해 다소 읽을 수!(stringA!.isEmpty) .

개인적으로 약간 다른 형태를 선호합니다.

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

위의 문장 if에서 변수가 일 때 전체 블록이 실행되지 않는다는 것은 즉시 매우 분명합니다 nil.


0

UITextField 에서 값을 가져오고 nil& empty문자열을 확인할 때 도움이됩니다.

@IBOutlet weak var myTextField: UITextField!

buttonUITextField에서 문자열을 가져오고 다른 작업 을 수행하는 함수 (을 탭 할 때 )가 있습니다.

@IBAction func getStringFrom_myTextField(_ sender: Any) {

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

이것은 nil가치뿐만 아니라 돌볼 것입니다empty 문자열 합니다.

그것은 나를 위해 완벽하게 잘 작동했습니다.


0

내 의견으로는, 빈 문자열을 확인하는 가장 좋은 방법은 문자열 카운트를 취하는 것입니다.

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

이 기능을 사용할 수 있습니다

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

2
빠른 사용자가 아닙니다. nil이 전달되면 왜 이것이 예외를 throw하지 않는지 설명 할 수 있습니까?
— Foon

nil이 함수에 전혀 전달할 수 없기 때문에 예외가 발생하지 않습니다 (objc 제외).이 경우 실제로 충돌이 발생합니다.
— Alfonso

이것은 질문에 대답하지 않습니다. 옵션을 받아들이지 않기 때문에 nil을 확인하지 않습니다
— Wayne Ellery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.