Open onmyway133 opened 8 years ago
func test() {
let defaults = NSUserDefaults.standardUserDefaults()
defaults.set("bool", value: true)
XCTAssertEqual(defaults.get("bool"), true)
defaults.set("int", value: 10)
XCTAssertEqual(defaults.get("int"), 10)
defaults.set("float", value: 15.0)
XCTAssertEqual(defaults.get("float"), 15.0)
defaults.set("double", value: 20.0)
XCTAssertEqual(defaults.get("double"), 20.0)
defaults.set("string", value: "hello")
XCTAssertEqual(defaults.get("string"), "hello")
defaults.set("array", value: [1, 2, 3])
XCTAssertEqual(defaults.get("array"), [1, 2, 3])
defaults.set("dictionary", value: ["one": 1, "two": 2])
XCTAssertEqual(defaults.get("dictionary"), ["one": 1, "two": 2])
defaults.set("url", value: NSURL(string: "http://www.google.com"))
print(defaults.valueForKey("url"))
XCTAssertEqual(defaults.get("url"), NSURL(string: "http://www.google.com"))
defaults.set("date", value: NSDate(timeIntervalSince1970: 20))
XCTAssertEqual(defaults.get("date"), NSDate(timeIntervalSince1970: 20))
defaults.set("none", value: UIColor.redColor())
// XCTAssertEqual(defaults.get("none"), nil as AnyObject)
}
public extension NSUserDefaults {
func get<T: NSDataConvertible>(key: String) -> T? {
guard let data = objectForKey(key) as? NSData else { return nil }
return T.fromData(data) as? T
}
func set<T: NSDataConvertible>(key: String, value: T?) {
guard let value = value else {
removeObjectForKey(key)
return
}
guard let data = value.toData else { return }
setObject(data, forKey: key)
}
func exists(key: String) -> Bool {
return valueForKey(key) != nil
}
}
public protocol NSDataConvertible {
associatedtype T
static func fromData(data: NSData) -> T?
var toData: NSData? { get }
}
extension NSData: NSDataConvertible {
public typealias T = NSData
public static func fromData(data: NSData) -> T? {
return data
}
public var toData: NSData? {
return self
}
}
extension Bool: NSDataConvertible {
public typealias T = Bool
public static func fromData(data: NSData) -> T? {
return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Bool
}
public var toData: NSData? {
return NSKeyedArchiver.archivedDataWithRootObject(self)
}
}
subscript
public extension NSUserDefaults {
subscript(key: String) -> String {
return "string"
}
subscript(key: Int) -> Int {
return 1
}
}
subscript with generic
public struct Key<T> {
let value: T
}
public extension NSUserDefaults {
subscript(key: Key<String>) -> String {
return ""
}
subscript(key: Key<String>) -> Int {
return 1
}
subscript(key: Key<Int>) -> String {
return "int"
}
}
overload in objective C subclass, not work
public extension NSUserDefaults {
func get(string: String) -> String {
return ""
}
func get(int: String) -> Int {
return 1
}
}
not derived from objective C, work
public class A {
subscript(string: String) -> String {
return ""
}
subscript(string: String) -> Int {
return 1
}
}
public class B {
func get(string: String) -> String {
return ""
}
func get(string: String) -> Int {
return 1
}
}
Swift type signature