是否有API将布尔值的大多数可能的String表示形式(例如"True","true","False","false","yes","no","1","0")转换为Bool在斯威夫特?
如果没有,那么从头开始编码这个最类似Swift的方法是什么?它是一个功能map()操作吗?或者是其他东西?
这个实例中的原始源数据是JSON,但我对以尽可能类似Swift的方式解决问题的关键感兴趣,因此在此过程中学习更多关于语言的知识.
Kir*_*ins 82
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
Duy*_*Hoa 38
在objective-C中,我们有一个String的boolValue.如果Swift中不存在,您可以将字符串转换为NSString然后使用它
var aString = NSString(string: "tRue")
var b = aString.boolValue
Run Code Online (Sandbox Code Playgroud)
如果aString.upperCase =="TRUE",b应该返回true
更新: for Info(刚刚在Apple 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.
Run Code Online (Sandbox Code Playgroud)
更新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)")
}
Run Code Online (Sandbox Code Playgroud)
控制台日志:
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
Run Code Online (Sandbox Code Playgroud)
我们可以通过简化规则来提高扩展解决方案的性能.性能取决于我们如何实施规则.
Nic*_*ini 32
类型转换以及一个很好的String扩展,你就可以运行了
extension String {
var boolValue: Bool {
return NSString(string: self).boolValue
}}
Run Code Online (Sandbox Code Playgroud)
小智 13
用这个,
self.boolType = NSString(string:stringType!).boolValue
Run Code Online (Sandbox Code Playgroud)
正如已经建议的那样,我将构建一个扩展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
Run Code Online (Sandbox Code Playgroud)
如果您使用NSString对象及其boolValue()方法,请小心,因为它true遇到"Y","y","T","t"或数字1-9时返回(请参阅此处的文档).
举个例子:
let nsString = NSString(string: "tFalse")
nsString.boolValue // true
Run Code Online (Sandbox Code Playgroud)
我认为最简单的方法是:
let someString = "true"
let convertedBool = Bool(someString) ?? false
Run Code Online (Sandbox Code Playgroud)
我采用了Nicolas Manzini的解决方案,并对其进行了一些修改。我建议使用强制转换运算符,因为它在String和NSString之间桥接。尚不清楚它是否是免费的桥梁,但是它应该比盲目创建新对象具有更好的性能。
extension String {
var boolValue: Bool {
return (self as NSString).boolValue
}
}
Run Code Online (Sandbox Code Playgroud)
没有其他答案涉及完整或混合大写字符串的潜力。那么为什么不接受 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法是:
let trueBoolString = "TRUE" // or "True", "true", "YES", "yEs", and so on
print(trueBoolString.bool) // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52860 次 |
| 最近记录: |