Skip to content

Commit 35df019

Browse files
committed
Fix for when key is a String rather than NSString. Otherwise you can get the following crash:
Could not cast value of type 'Swift.AnyHashable' (0x1027b3b10) to 'SwiftFoundation.NSObject' (0x101a56668). 2018-02-16 14:30:46.355774+0000 TestFoundation[7306:8715333] Could not cast value of type 'Swift.AnyHashable' (0x1027b3b10) to 'SwiftFoundation.NSObject' (0x101a56668). (lldb) up frame #9: 0x000000010165b114 SwiftFoundation`NSMutableDictionary.subscript.setter(newValue=some, key=Swift.AnyHashable @ 0x00007fff5fbfcd88, self=0x000060800e181fe0) at NSDictionary.swift:649 646 } 647 set { 648 if let val = newValue { -> 649 �[4ms�[0metObject(val, forKey: key) 650 } else { 651 removeObject(forKey: key) 652 } (lldb) up frame #10: 0x00000001004c0443 TestFoundation`static Dictionary.twEncode(data=TestFoundation.TwoWayMirror @ 0x00007fff5fbfce00, self=[Key : Value]) at TwoWayMirror.swift:386 383 #if os(Linux) 384 let key = NSString(string: key as! String) 385 #endif -> 386 dict[key] �[4m=�[0m TwoWayMirror.encode(mirror: &mirror) 387 } 388 return dict 389 } (lldb)
1 parent cd24576 commit 35df019

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

Foundation/NSDictionary.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ open class NSMutableDictionary : NSDictionary {
586586
guard type(of: self) === NSDictionary.self || type(of: self) === NSMutableDictionary.self else {
587587
NSRequiresConcreteImplementation()
588588
}
589-
_storage[(aKey as! NSObject)] = _SwiftValue.store(anObject)
589+
_storage[_SwiftValue.store(aKey)] = _SwiftValue.store(anObject)
590590
}
591591

592592
public convenience required init() {

TestFoundation/TestNSDictionary.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class TestNSDictionary : XCTestCase {
3232
("test_mutableCopying", test_mutableCopying),
3333
("test_writeToFile", test_writeToFile),
3434
("test_initWithContentsOfFile", test_initWithContentsOfFile),
35+
("test_settingWithStringKey", test_settingWithStringKey),
3536
]
3637
}
3738

@@ -222,6 +223,12 @@ class TestNSDictionary : XCTestCase {
222223
}
223224
}
224225

226+
func test_settingWithStringKey() {
227+
let dict = NSMutableDictionary()
228+
// has crashed in the past
229+
dict["stringKey"] = "value"
230+
}
231+
225232
private func createTestFile(_ path: String, _contents: Data) -> String? {
226233
let tempDir = NSTemporaryDirectory() + "TestFoundation_Playground_" + NSUUID().uuidString + "/"
227234
do {

0 commit comments

Comments
 (0)