将swift的泛字符串类型转为强类型

2016-12-07  本文已影响69人  coderzcj
  1. 泛字符串类型 API
// 泛字符串类型
let image = UIImage(named: "PalletTown")
// 强类型
let tableView = UITableView(frame: CGRect(), style: .plain)
  1. 缺点:
UserDefaults.standard.set(true, forKey: “isUserLoggedIn”)
UserDefaults.standard.bool(forKey: "isUserLoggedIn")
let keyA = "isUserLoggedIn"
let keyB = "isUserLoggedIn"
UserDefaults.standard.set(true, forKey: keyA)
UserDefaults.standard.set(false, forKey: keyB)
tableView.register(UITableViewCell.self,forCellReuseIdentifier: "CellIdentifer")
let cell = tableVie.dequeueReusableCell(withIdentifier: "CelIdentifer")
  1. 常见处理方法:
struct Constants {
    struct Account {
        static let isUserLoggedIn = "isUserLoggedIn"
    }
}
UserDefaults.standard.set(true, forKey: Constants.Account.isUserLoggedIn)
UserDefaults.standard.bool(forKey: Constants.Account.isUserLoggedIn)
enum Constants {
    enum Account : String {
        case isUserLoggedIn
    }
}
UserDefaults.standard.set(true, forKey: Constants.Account.isUserLoggedIn.rawValue)
UserDefaults.standard.bool(forKey: Constants.Account.isUserLoggedIn.rawValue)
  1. 常见问题:
struct Constants {
    struct Account {
        static let isUserLoggedIn = "Account.isUserLoggedIn"
    }
    struct Password {
        static let isUserLoggedIn = "Password.isUserLoggedIn"
    }
}
UserDefaults.standard.set(true, forKey: Constants.Account.isUserLoggedIn)
UserDefaults.standard.set(false, forKey: Constants.Password.isUserLoggedIn)
UserDefaults.standard.bool(forKey: Constants.Account.isUserLoggedIn)  // true
UserDefaults.standard.set(true, forKey: .isUserLoggedIn)
  1. 扩展协议
protocol BoolUserDefaultable  {
    associatedtype BoolDefaultKey : RawRepresentable
}
extension BoolUserDefaultable where BoolDefaultKey.RawValue == String {
    
    // Set
  static func set(_ value: Bool, forKey key: BoolDefaultKey) {
    let key = key.rawValue
    UserDefaults.standard.set(value, forKey: key)
}
  // Get
static func bool(forKey key: BoolDefaultKey) -> Bool {
    let key = key.rawValue
    return UserDefaults.standard.bool(forKey: key)
}
}

使用:

struct Account : BoolUserDefaultSettable {
    enum BoolDefaultKey : String {
        case isUserLoggedIn
    }
}
// Setter
Account.set(true, forKey: .isUserLoggedIn)
// Getter
Account.bool(forKey: .isUserLoggedIn)
protocol KeyNamespaceable { }
extension KeyNamespaceable {
    static func namespace<T: RawRepresentable>(_ key: T) -> String where T.RawValue == String {
        return "\(Self.self).\(key.rawValue)"
    }
}
// MARK: - Bool Defaults
protocol BoolUserDefaultable : KeyNamespaceable {
    associatedtype BoolDefaultKey : RawRepresentable
}
extension BoolUserDefaultable where BoolDefaultKey.RawValue == String {
    
    // Set
    
    static func set(_ bool: Bool, forKey key: BoolDefaultKey) {
        let key = namespace(key)
        UserDefaults.standard.set(bool, forKey: key)
    }
    
    // Get
    
    static func bool(forKey key: BoolDefaultKey) -> Bool {
        let key = namespace(key)
        return UserDefaults.standard.bool(forKey: key)
    }
}

使用:

struct Password : BoolUserDefaultSettable {
    enum BoolDefaultKey : String {
        case isUserLoggedIn
    }
}
// Setter
Password.set(true, forKey: .isUserLoggedIn)
// Getter
Password.bool(forKey: .isUserLoggedIn)
 extension UserDefaults {
    struct Account : BoolUserDefaultable {
        enum BoolDefaultKey : String {
            case isUserLoggedIn
        }
    }
  struct Password : BoolUserDefaultSettable {
    enum BoolDefaultKey : String {
        case isUserLoggedIn
    }
}
}
// Set
UserDefaults.Account.set(true, forKey: .isUserLoggedIn)
// Get
let isUserLoggedIn = UserDefaults.Account.bool(forKey: .isUserLoggedIn)
上一篇下一篇

猜你喜欢

热点阅读