处理Notifications和UserDefaults密钥名称的字符串名称的最常用方法是什么

时间:2018-12-02 22:56:11

标签: swift encapsulation

我将在整个应用程序中使用一些字符串名称作为Notifications和UserDefault名称。

我听说为了类型安全,将notification名或UserDefaults键名定义为静态字符串并使其成为类或结构的一部分是一种好习惯。

处理Notification和UserDefault名称的字符串名称的最常用方法是什么?

我曾考虑过将它们作为全局变量放入我的AppDelgate类中,如下所示...

let MY_STRING_NAME = "My string name"

class AppDelegate: UIResponder, UIApplicationDelegate {}

/// Then just use MY_STRING_NAME in other classes. 

class SomeClass {
    let myStringName:String = "My string name"
}
/// Then use myClassInstance.myStringName

什么是最好的方法?

3 个答案:

答案 0 :(得分:4)

UserDefaults的一个选项是创建一个帮助程序类,该类隐藏您正在使用UserDefaults的事实。这使得它在您的其余代码中看起来就像在使用简单的类及其属性一样。

类似这样的东西:

class MyAppPreferences {
    static let shared = MyAppPreferences()

    private let highScoreKey = "highScore"
    var highScore: Int {
        get {
            return UserDefaults.standard.integer(forKey: highScoreKey)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: highScoreKey)
        }
    }
}

您可以在其他代码上进行设置:

MyAppPreferences.shared.highScore = 100

或以下内容进行阅读:

let score = MyAppPreferences.shared.highScore

为您的应用程序所需的每个应用程序首选项添加计算所得的属性和私钥。这样可以使您的其余代码更简洁。

由于某种原因,您将来需要更改一个或多个首选项的存储方式,因此只需要在一个位置更改代码即可。

对于通知名称,可以将常量添加到与通知关联的每个类。您可以在许多iOS类中看到这种模式,例如UIApplication,UITextView和其他类。

class SomeClass {
    static someClassEventNotification = NSNotification.Name("someUniqueName")
}

答案 1 :(得分:1)

我认为使用枚举是定义常量的更合适的方法

用户默认设置:

class MyAppPreferences {
    static let shared = MyAppPreferences()

    private enum Key: String {
        case userName
        case email
    }

    var userName: String? {
        get {
            return UserDefaults.standard.string(forKey: Key.userName.rawValue)
        }
        set {
            UserDefaults.standard.set(newValue, forKey: Key.userName.rawValue)
        }
    }
}

通知:

enum AppNotification: String {
    case didReceivedData
    case didCompleteTask
}

extension Notification.Name {
    init(_ appNotification:AppNotification) {
        self.init(appNotification.rawValue)
    }
}

//Use:

func notify() {
    NotificationCenter.default.post(.init(name: .init(.didReceivedData)))
} 

答案 2 :(得分:0)

常见方法是创建

struct Constants { 
   static let key1 = "value1"
   static let key2 = "value2"
   .....
}

//用于通知

extension Notification.Name {
  static let didReceiveData = Notification.Name("didReceiveData")
  static let didCompleteTask = Notification.Name("didCompleteTask")
}

有些人更喜欢带有(k字母前缀)的全局变量

let kDomain = "value1"

日期可以追溯到Objective-C中的#define,但是使用常量是一种对阅读器进行编码的干净方法