diff --git a/Foundation/NSString.swift b/Foundation/NSString.swift index fc4ae5ddc6..17ab810bfd 100644 --- a/Foundation/NSString.swift +++ b/Foundation/NSString.swift @@ -488,7 +488,16 @@ extension NSString { public var boolValue: Bool { get { - NSUnimplemented() + let scanner = NSScanner(string: _swiftObject) + // skip initial whitespace if present + scanner.scanCharactersFromSet(NSCharacterSet.whitespaceCharacterSet()) + // scan a single optional '+' or '-' character, followed by zeroes + if scanner.scanString(string: "+") == nil { + scanner.scanString(string: "-") + } + // scan any following zeroes + scanner.scanCharactersFromSet(NSCharacterSet(charactersInString: "0")) + return scanner.scanCharactersFromSet(NSCharacterSet(charactersInString: "tTyY123456789")) != nil } } diff --git a/TestFoundation/TestNSString.swift b/TestFoundation/TestNSString.swift index ff3bb0528f..384458c30c 100644 --- a/TestFoundation/TestNSString.swift +++ b/TestFoundation/TestNSString.swift @@ -21,6 +21,7 @@ class TestNSString : XCTestCase { var allTests : [(String, () -> ())] { return [ + ("test_boolValue", test_boolValue ), ("test_BridgeConstruction", test_BridgeConstruction ), ("test_isEqualToStringWithSwiftString", test_isEqualToStringWithSwiftString ), ("test_isEqualToObjectWithNSString", test_isEqualToObjectWithNSString ), @@ -37,6 +38,17 @@ class TestNSString : XCTestCase { ("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ), ] } + + func test_boolValue() { + let trueStrings: [NSString] = ["t", "true", "TRUE", "tRuE", "yes", "YES", "1", "+000009"] + for string in trueStrings { + XCTAssert(string.boolValue) + } + let falseStrings: [NSString] = ["false", "FALSE", "fAlSe", "no", "NO", "0", "", "_true", "-00000"] + for string in falseStrings { + XCTAssertFalse(string.boolValue) + } + } func test_BridgeConstruction() { let literalConversion: NSString = "literal"