Skip to content

Commit 9082096

Browse files
committed
Merge pull request #108 from zixun/master
implement the init(contentsOfFile) method in NSString
2 parents d87cf75 + a4f0b60 commit 9082096

File tree

4 files changed

+33
-1
lines changed

4 files changed

+33
-1
lines changed

Foundation.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@
225225
AA664D4F1C1B03CA00C22186 /* TestNSNumberFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA664D4E1C1B03CA00C22186 /* TestNSNumberFormatter.swift */; };
226226
C2A9D75C1C15C08B00993803 /* TestNSUUID.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2A9D75B1C15C08B00993803 /* TestNSUUID.swift */; };
227227
C93559291C12C49F009FD6A9 /* TestNSAffineTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = C93559281C12C49F009FD6A9 /* TestNSAffineTransform.swift */; };
228+
CE19A88C1C23AA2300B4CB6A /* NSStringTestData.txt in Resources */ = {isa = PBXBuildFile; fileRef = CE19A88B1C23AA2300B4CB6A /* NSStringTestData.txt */; };
228229
DCDBB8331C1768AC00313299 /* TestNSData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCDBB8321C1768AC00313299 /* TestNSData.swift */; };
229230
E876A73E1C1180E000F279EC /* TestNSRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = E876A73D1C1180E000F279EC /* TestNSRange.swift */; };
230231
EA66F6361BEED03E00136161 /* TargetConditionals.h in Headers */ = {isa = PBXBuildFile; fileRef = EA66F6351BEED03E00136161 /* TargetConditionals.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -570,6 +571,7 @@
570571
AA664D4E1C1B03CA00C22186 /* TestNSNumberFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSNumberFormatter.swift; sourceTree = "<group>"; };
571572
C2A9D75B1C15C08B00993803 /* TestNSUUID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSUUID.swift; sourceTree = "<group>"; };
572573
C93559281C12C49F009FD6A9 /* TestNSAffineTransform.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSAffineTransform.swift; sourceTree = "<group>"; };
574+
CE19A88B1C23AA2300B4CB6A /* NSStringTestData.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NSStringTestData.txt; sourceTree = "<group>"; };
573575
DCDBB8321C1768AC00313299 /* TestNSData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSData.swift; sourceTree = "<group>"; };
574576
E876A73D1C1180E000F279EC /* TestNSRange.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestNSRange.swift; sourceTree = "<group>"; };
575577
EA313DFC1BE7F2E90060A403 /* CFURLComponents_Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CFURLComponents_Internal.h; sourceTree = "<group>"; };
@@ -1053,6 +1055,7 @@
10531055
isa = PBXGroup;
10541056
children = (
10551057
EA66F6791BF9401E00136161 /* Info.plist */,
1058+
CE19A88B1C23AA2300B4CB6A /* NSStringTestData.txt */,
10561059
528776181BF27D9500CB0090 /* Test.plist */,
10571060
EA66F63B1BF1619600136161 /* NSURLTestData.plist */,
10581061
);
@@ -1602,6 +1605,7 @@
16021605
files = (
16031606
528776191BF27D9500CB0090 /* Test.plist in Resources */,
16041607
EA66F6481BF1619600136161 /* NSURLTestData.plist in Resources */,
1608+
CE19A88C1C23AA2300B4CB6A /* NSStringTestData.txt in Resources */,
16051609
);
16061610
runOnlyForDeploymentPostprocessing = 0;
16071611
};

Foundation/NSString.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1259,7 +1259,20 @@ extension NSString {
12591259
}
12601260

12611261
public convenience init(contentsOfFile path: String, encoding enc: UInt) throws {
1262-
NSUnimplemented()
1262+
let readResult = try NSData.readBytesFromFileWithExtendedAttributes(path, options: [])
1263+
guard let cf = CFStringCreateWithBytes(kCFAllocatorDefault, UnsafePointer<UInt8>(readResult.bytes), readResult.length, CFStringConvertNSStringEncodingToEncoding(enc), true) else {
1264+
throw NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.CoderReadCorruptError.rawValue, userInfo: [
1265+
"NSDebugDescription" : "Unable to create a string using the specified encoding."
1266+
])
1267+
}
1268+
var str: String?
1269+
if String._conditionallyBridgeFromObject(cf._nsObject, result: &str) {
1270+
self.init(str!)
1271+
} else {
1272+
throw NSError(domain: NSCocoaErrorDomain, code: NSCocoaError.CoderReadCorruptError.rawValue, userInfo: [
1273+
"NSDebugDescription" : "Unable to bridge CFString to String."
1274+
])
1275+
}
12631276
}
12641277

12651278
public convenience init(contentsOfURL url: NSURL, usedEncoding enc: UnsafeMutablePointer<UInt>) throws {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
swift-corelibs-foundation

TestFoundation/TestNSString.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class TestNSString : XCTestCase {
4444
("test_longLongValue", test_longLongValue ),
4545
("test_rangeOfCharacterFromSet", test_rangeOfCharacterFromSet ),
4646
("test_CFStringCreateMutableCopy", test_CFStringCreateMutableCopy),
47+
("test_FromContentOfFile",test_FromContentOfFile),
4748
("test_swiftStringUTF16", test_swiftStringUTF16),
4849
("test_stringByTrimmingCharactersInSet", test_stringByTrimmingCharactersInSet),
4950
("test_initializeWithFormat", test_initializeWithFormat),
@@ -229,6 +230,19 @@ class TestNSString : XCTestCase {
229230
let string = NSString(CString: bytes.map { Int8(bitPattern: $0) }, encoding: NSUTF8StringEncoding)
230231
XCTAssertNil(string)
231232
}
233+
234+
func test_FromContentOfFile() {
235+
let testFilePath = testBundle().pathForResource("NSStringTestData", ofType: "txt")
236+
XCTAssertNotNil(testFilePath)
237+
238+
do {
239+
let str = try NSString(contentsOfFile: testFilePath!, encoding: NSUTF8StringEncoding)
240+
} catch {
241+
XCTFail("Unable to init NSString from contentsOfFile:encoding:")
242+
}
243+
244+
XCTAssertEqual(str, "swift-corelibs-foundation")
245+
}
232246

233247
func test_uppercaseString() {
234248
XCTAssertEqual(NSString(stringLiteral: "abcd").uppercaseString, "ABCD")

0 commit comments

Comments
 (0)