使用类中的枚举作为参数

时间:2017-10-31 09:30:17

标签: ios swift enums

基本上我有一个DataManager单例如下:

class DataManager {    
    static let shared = DataManager()

    private init() {}

    static func set(_ object: String, forKey defaultName: String) {
        let defaults: UserDefaults = UserDefaults.standard
        defaults.set(object, forKey:defaultName)
        defaults.synchronize()
    }

    static func object(forKey key: String) -> String {
        let defaults: UserDefaults = UserDefaults.standard
        return defaults.object(forKey: key) as! String
    }
}

在设置或检索已保存的对象时,我想要实现以下目的:

DataManager.set("some hash", forKey: .hash)

而不是:

DataManager.set("some hash", forKey: "hash")

另外,我正在寻找的功能的技术术语是什么?

4 个答案:

答案 0 :(得分:1)

是的,您可以使用枚举,例如:

enum DataManagerKey: String {
   case hash
}

然后在set方法中使用它:

static func set(_ object: String, forKey defaultName: DataManagerKey)

答案 1 :(得分:1)

你可以有一个枚举,只需要DefaultKey

enum DefaultKey: String {
  case hash = "hash"
  case secondKey = "secondKey"
  case thirdKey = "thirdKey"
}

现在你需要做的是

static func set(_ object: String, forKey keyType: DefaultKey) {
  let defaults: UserDefaults = UserDefaults.standard
  let key = keyType.rawValue // rawvalue for keyType .hash will actually return you "hash".
  defaults.set(object, forKey: key)
  defaults.synchronize()
}

现在您可以调用类似

的功能了

DataManager.set("some hash", forKey: .hash)

答案 2 :(得分:1)

您可以通过实现枚举并让defaultName参数数据类型为实现的枚举来实现它,如下所示:

enum DataManagerDefaultName: String {
    case hash
    // other cases goes here
}

用法:

class DataManager {
    static let shared = DataManager()

    private init() {

    }

    static func set(_ object: String, forKey defaultName: String) { {
        let defaults: UserDefaults = UserDefaults.standard
        defaults.set(object, forKey:defaultName.rawValue)
        defaults.synchronize()
    }

    static func object(forKey key: DataManagerDefaultName) -> String {
        let defaults: UserDefaults = UserDefaults.standard
        return defaults.object(forKey: key) as! String
    }
}

执行:

// executing:

// setting the value:
DataManager.set("my value", forKey: .hash)

// getting the value:
let myValue = DataManager.object(forKey: .hash) // "my value"

请注意,您不仅可以使用枚举设置值,还可以获取它。

答案 3 :(得分:1)

我找到了在课堂上定义enum最干净的方法,如下所示:

class DataManager {
    enum Key: String {
        case hash
    }

    static let shared = DataManager()

    private init() {

    }

    static func set(_ object: String, forKey defaultName: DataManager.Key) {
        let defaults: UserDefaults = UserDefaults.standard
        defaults.set(object, forKey:defaultName.rawValue)
        defaults.synchronize()
    }

    static func object(forKey key: DataManager.Key) -> String {
        let defaults: UserDefaults = UserDefaults.standard
        return defaults.object(forKey: key.rawValue) as! String
    }
}

用法与在外部定义的用法保持一致,因为Swift将推断出DataManager.Key前缀:

DataManager.set("some hash", forKey: .hash)