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

어쩌면 당신은 (또는 이와 비슷한) 이름 isNilOrEmptyhasValue
이슬람교 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
이런 내가는 단지 내가 만들 것 조정할에서 이름을 변경하는 것입니다 isNilOrEmptyisEmptyOrNil가 자동 완성에 대해 동일한 패턴을 통해 쉽게 검색 가능 그래서 접두사와 일치하는. 나는이 방법으로 찾은 동료들로부터이 확장 기능을 더 많이 채택한 것을 알았습니다.
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.