Skip to content

Commit c0cd1d1

Browse files
woxtucompnerd
authored andcommitted
Fix UserDefaults.string(forKey:) behavior
1 parent bd1c1ee commit c0cd1d1

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

Sources/Foundation/UserDefaults.swift

+19-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,25 @@ open class UserDefaults: NSObject {
147147
}
148148

149149
open func string(forKey defaultName: String) -> String? {
150-
return object(forKey: defaultName) as? String
150+
guard let aVal = object(forKey: defaultName) else {
151+
return nil
152+
}
153+
if let bVal = aVal as? String {
154+
return bVal
155+
}
156+
if let bVal = aVal as? Bool {
157+
return NSNumber(value: bVal).stringValue
158+
}
159+
if let bVal = aVal as? Int {
160+
return NSNumber(value: bVal).stringValue
161+
}
162+
if let bVal = aVal as? Float {
163+
return NSNumber(value: bVal).stringValue
164+
}
165+
if let bVal = aVal as? Double {
166+
return NSNumber(value: bVal).stringValue
167+
}
168+
return nil
151169
}
152170

153171
open func array(forKey defaultName: String) -> [Any]? {

Tests/Foundation/Tests/TestUserDefaults.swift

+40
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class TestUserDefaults : XCTestCase {
3030
("test_setValue_BoolFromString", test_setValue_BoolFromString ),
3131
("test_setValue_IntFromString", test_setValue_IntFromString ),
3232
("test_setValue_DoubleFromString", test_setValue_DoubleFromString ),
33+
("test_setValue_StringFromBool", test_setValue_StringFromBool ),
34+
("test_setValue_StringFromInt", test_setValue_StringFromInt ),
35+
("test_setValue_StringFromFloat", test_setValue_StringFromFloat ),
36+
("test_setValue_StringFromDouble", test_setValue_StringFromDouble ),
3337
("test_volatileDomains", test_volatileDomains),
3438
("test_persistentDomain", test_persistentDomain ),
3539
]
@@ -245,6 +249,42 @@ class TestUserDefaults : XCTestCase {
245249
XCTAssertEqual(defaults.double(forKey: "key1"), 12.34)
246250
}
247251

252+
func test_setValue_StringFromBool() {
253+
let defaults = UserDefaults.standard
254+
255+
// Register a bool default value. UserDefaults.string(forKey:) is supposed to return the converted String value
256+
defaults.set(true, forKey: "key1")
257+
258+
XCTAssertEqual(defaults.string(forKey: "key1"), "1")
259+
}
260+
261+
func test_setValue_StringFromInt() {
262+
let defaults = UserDefaults.standard
263+
264+
// Register a int default value. UserDefaults.string(forKey:) is supposed to return the converted String value
265+
defaults.set(42, forKey: "key1")
266+
267+
XCTAssertEqual(defaults.string(forKey: "key1"), "42")
268+
}
269+
270+
func test_setValue_StringFromFloat() {
271+
let defaults = UserDefaults.standard
272+
273+
// Register a float default value. UserDefaults.string(forKey:) is supposed to return the converted String value
274+
defaults.set(12.34 as Float, forKey: "key1")
275+
276+
XCTAssertEqual(defaults.string(forKey: "key1"), "12.34")
277+
}
278+
279+
func test_setValue_StringFromDouble() {
280+
let defaults = UserDefaults.standard
281+
282+
// Register a double default value. UserDefaults.string(forKey:) is supposed to return the converted String value
283+
defaults.set(12.34, forKey: "key1")
284+
285+
XCTAssertEqual(defaults.string(forKey: "key1"), "12.34")
286+
}
287+
248288
func test_volatileDomains() {
249289
let dateKey = "A Date",
250290
stringKey = "A String",

0 commit comments

Comments
 (0)