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
'Development Tip' 카테고리의 다른 글
XCode 6.3 경고 : 속성 합성 (0) | 2020.12.02 |
---|---|
전략 패턴과 명령 패턴의 차이점 (0) | 2020.12.02 |
UIToolBar 왼쪽 및 오른쪽 패딩 조정 방법 (0) | 2020.12.02 |
EF4-선택한 저장 프로 시저가 열을 반환하지 않음 (0) | 2020.12.02 |
자바에서 for 루프에서 벗어나기 (0) | 2020.12.02 |