Development Tip

Swift에서 String을 Bool로 변환-API 또는 대부분의 Swift와 유사한 접근 방식을 통해

yourdevel 2020. 12. 2. 22:04
반응형

Swift에서 String을 Bool로 변환-API 또는 대부분의 Swift와 유사한 접근 방식을 통해


부울 값의 가능한 대부분의 문자열 표현 (예 : "True", "true", "False", "false", "yes", "no", "1", "0")을 Bool로 변환하는 API가 있습니까? Swift에서?

그렇지 않다면 이것을 처음부터 코딩하는 가장 신속한 접근 방식은 무엇입니까? 기능적인 map () 작업입니까? 또는 다른 것?

이 인스턴스의 원본 소스 데이터는 JSON이지만 가능한 가장 Swift와 유사한 방식으로 문제를 해결하고 그 과정에서 언어에 대해 더 많이 배우는 핵심에 관심이 있습니다.


방식 AFAIK는 내장되어 있지 않습니다. 표준과 유사한 방법 toInt()은 다음과 같습니다.

extension String {
    var bool: Bool? {
        switch self.lowercased() {
        case "true", "t", "yes", "y", "1":
            return true
        case "false", "f", "no", "n", "0":
            return false
        default:
            return nil
        }
    }
}

Objective-C에서는 문자열에 대한 boolValue가 있습니다. 문자열을 NSString으로 변환 한 다음 Swift에없는 경우 사용할 수 있습니다.

var aString = NSString(string: "tRue")

var b = aString.boolValue

aString.upperCase == "TRUE"인 경우 b는 true를 반환해야합니다.

업데이트 : 정보 (애플 API에서 볼 수 있음) :

var boolValue: Bool { get } // Skips initial space characters (whitespaceSet), or optional -/+ sign followed by zeroes. Returns YES on encountering one of "Y", "y", "T", "t", or a digit 1-9. It ignores any trailing characters.

업데이트 2 : 확장 방법으로이 방법의 성능 테스트를 수행했습니다. 이 방법의 성능은 인상적입니다. 다음은 내 테스트 코드입니다. 시뮬레이터를 사용하여 GCD 스레드에서 이러한 함수를 차례로 호출했습니다.

dispatch_async(dispatch_queue_create("com.haduyenhoa.test", nil), {
            self.test1()
            self.test2()
        })


func test1() {
    let testTrue: String = "TRue"
    let testFalse: String = "faLse"

    let testNil: String = "whoops!"

    let begin : NSDate = NSDate()

    NSLog("BEGIN native")
    var testTrueObjC: NSString
    var testFalseObjC : NSString
    var testNilObjC:NSString

    for index in 1...100000 {
        testTrueObjC = NSString(string:testTrue)
         testFalseObjC = NSString(string:testFalse)
        testNilObjC = NSString(string:testNil)

        var b1 = testTrueObjC.boolValue // {Some true}

        var b2 = testFalseObjC.boolValue // {Some false}
        var b3 = testNilObjC.boolValue // nil
    }
    let end : NSDate = NSDate()
    let interval = end.timeIntervalSinceDate(begin)
   NSLog("DURATION native: \(interval)")
}

func test2() {
    let testTrue: String = "TRue"
    let testFalse: String = "faLse"

    let testNil: String = "whoops!"

    let begin : NSDate = NSDate()
    NSLog("BEGIN extension")
    for index in 1...100000 {
        var b1 = testTrue.boolValue() // {Some true}
        var b2 = testFalse.boolValue() // {Some false}
        var b3 = testNil.boolValue() // nil
    }
    let end : NSDate = NSDate()
    let interval = end.timeIntervalSinceDate(begin)
    NSLog("DURATION extension: \(interval)")

}

콘솔 로그 :

2015-03-12 14:16:23.238 testSwift3[2343:298787] BEGIN native
2015-03-12 14:16:23.543 testSwift3[2343:298787] DURATION native: 0.305041968822479
2015-03-12 14:16:23.543 testSwift3[2343:298787] BEGIN extension
2015-03-12 14:16:35.360 testSwift3[2343:298787] DURATION extension: 11.8166469931602

규칙을 단순화하여 확장 솔루션의 성능을 향상시킬 수 있습니다. 성능은 규칙을 구현하는 방법에 따라 다릅니다.


멋진 문자열 확장과 함께 타입 캐스팅을하고 실행 중입니다.

extension String {
var boolValue: Bool {
    return NSString(string: self).boolValue
}}

이것을 사용하십시오.

self.boolType = NSString(string:stringType!).boolValue

이미 제안, 나는의 확장을 구축 할 것입니다 String만이 변환하고자하는 문자열 리터럴 나열 true하고 false유지, nil변환하지 않습니다 무엇을 경우 (또는 반환 false? 물론 그 경우에 당신의 선택!). 그건 그렇고, 당신은 당신의 방법이 대소 문자를 구분하는 것을 원하지 않을 것입니다.

예를 들면 :

extension String {
    func boolValue() -> Bool? {
        let trueValues = ["true", "yes", "1"]
        let falseValues = ["false", "no", "0"]

        let lowerSelf = self.lowercaseString

        if contains(trueValues, lowerSelf) {
            return true
        } else if contains(falseValues, lowerSelf) {
            return false
        } else {
            return nil
        }
    }
}

let testTrue: String = "TRue"
testTrue.boolValue() // {Some true}
let testFalse: String = "faLse"
testFalse.boolValue() // {Some false}
let testNil: String = "whoops!"
testNil.boolValue() // nil

"Y", "y", "T", "t"또는 숫자 1-9를 만나면 반환 되므로 NSString개체 및 해당 boolValue()메서드 를 사용하는 경우주의 하십시오true ( 여기 문서 참조 ).

예로서:

let nsString = NSString(string: "tFalse")
nsString.boolValue // true

Nicolas Manzini의 솔루션을 가져와 약간 수정했습니다. 캐스트 연산자를 사용하는 것이 좋습니다. String과 NSString 사이에 연결되어 있기 때문입니다. 수신자 부담 다리인지는 알 수 없지만 맹목적으로 새 물체를 만드는 것보다 더 나은 성능을 가져야합니다.

extension String {

    var boolValue: Bool {
        return (self as NSString).boolValue
    }
}

위 답변의 결론 :

간단하게 한 줄 연장하여 사용할 수 있습니다.

스위프트 3

extension String {
    func boolValueFromString() -> Bool {
        return NSString(string: self).boolValue
    }
}

용법

 if (dictCardData.value(forKey: "isadmin") as! String).boolValueFromString() {
    // Stuff
}

 var st = "false"

 extension String {
   func toBool() -> Bool{
    if self == "false" {
        return false
    }else{
        return true
    }
}
}

 if st.toBool() == false {
     println("its ok")
 }

전체 또는 혼합 대문자 문자열의 잠재력을 다루는 다른 답변은 없습니다. 그러니 Kirsteins의 대답을 받아들이고 그것을 계산 된 속성 마법과 shazam과 혼합하십시오.

extension String {
    var bool: Bool? {
        let lowercaseSelf = self.lowercased()

        switch lowercaseSelf {
        case "true", "yes", "1":
            return true
        case "false", "no", "0":
            return false
        default:
            return nil
        }
    }
}

사용법은 다음과 같습니다.

let trueBoolString = "TRUE"   // or "True", "true", "YES", "yEs", and so on
print(trueBoolString.bool)    // true

한 번 사용하면 이것을 시도하십시오.

let str:String = "1"

var boo:Bool = str == "1" || str == "true" || str == "True" || str == "yes"

선택적 문자열을 처리하고 기본값이 false 인이 구현을 선호합니다.

extension Bool {
    init(_ string: String?) {
        guard let string = string else { self = false; return }

        switch string.lowercased() {
        case "true", "yes", "1":
            self = true
        default:
            self = false
        }
    }
}

선택적 문자열에 대한 한 줄 솔루션

let value:String? = "put some string or even just nil here"
let trueOrFalse = NSString(string: value ?? "").boolValue

@Kirsteins 코드를 String 값이있는 Bool 이니셜 라이저로 리팩터링했습니다.

extension Bool {

    init?(string: String) {
        switch string {
        case "True", "true", "yes", "1":
            self = true
        case "False", "false", "no", "0":
            self = false
        default:
            return nil
        }
    }

}


// tests
let one = Bool(string: "SDASD") // nil
let two = Bool(string: "0") // false
let three = Bool(string: "true") // true
let four = Bool(string: "null") // nil

참고URL : https://stackoverflow.com/questions/28107051/convert-string-to-bool-in-swift-via-api-or-most-swift-like-approach

반응형