如何将 NSNotification.Name 重新定义为枚举?

How can I redefine NSNotification.Name as Enum?

我觉得写

NotificationCenter.default.post(name: NSNotification.Name(rawValue: "UserDatabaseUpdated"), object: nil);

非常丑陋且容易出错。因此我想把它变成这样:

enum NotifyTypes : NSNotification.Name {
    case userDatabaseUpdated = NSNotification.Name (rawValue: "UserDatabaseUpdated");
}

NotificationCenter.default.post(name: NotifyTypes.userDatabaseUpdated, object: nil);

但是Xcode给我错误:

'NotifyTypes' declares raw type 'NSNotification.Name', but does not conform to RawRepresentable and conformance could not be synthesized

这真的无法实现吗?我怎样才能解决这个问题?谢谢。

PS:我知道我可以做到这样:

enum NotifyTypes {
    case userDatabaseUpdated;
}

NotificationCenter.default.post(name: NSNotification.Name (rawValue: NotifyTypes.UserDatabaseUpdated.rawValue), object: nil);

但是这个更丑,我想去掉NSNotification.Name (rawValue:)

您可以使用 struct.

轻松实现此目的

定义结构如下:

struct NotifyTypes
{
    static let userDatabaseUpdated = NSNotification.Name("UserDatabaseUpdated")
}

并像这样使用它:

NotificationCenter.default.post(name: NotifyTypes.userDatabaseUpdated, object: nil);

编辑:要使用您在评论中提到的开关盒,您可以使用以下方式。

带有计算的 属性 到 return 通知名称的枚举声明:

enum NotifyType : String
{
    case userDatabaseUpdated = "UserDatabaseUpdated"

    // Computed property which returns notification name
    public var name: Notification.Name
    {
        return Notification.Name(self.rawValue)
    }
}

通知发布代码:

NotificationCenter.default.post(name: NotifyType.userDatabaseUpdated.name, object: nil);

通知捕获方法和 switch case 如下所示:

func yourFunc(notification : Notification)
{
    switch notification.name
    {
        case NotifyType.userDatabaseUpdated.name: print("Gotcha")
        default: print("Alien")

    }
}

这是我们目前正在做的方法,我想它看起来更好一些:

extension Notification.Name {
    static let userDatabaseUpdated = Notification.Name("UserDatabaseUpdated")
}

NotificationCenter.default.post(name: .userDatabaseUpdated, object: nil)

此外,您不必单独保留 struct/enum/or 任何其他数据结构,只需扩展 Notification.Name whenever/wherever 您需要的。

最好的方法是使用 Extension 然后像这样添加你的结构

extension Notification.Name {
    struct NotifyType {
        static let userDatabaseUpdate = Notification.Name(rawValue: "userDatabaseUpdate")
    }
}

现在要从任何地方使用它,您只需像这样调用通知本身

NotificationCenter.default.post(name: NSNotification.Name.NotifyType.userDatabaseUpdate, object: nil)

从 Swift 5 开始,更接近 OP 最初目标的更简洁的方法是:

enum NotifyTypes {
    static let userDatabaseUpdated = NSNotification.Name("userDatabaseUpdated")
}

然后发布将是:

NotificationCenter.default.post(name: userDatabaseUpdated, object: nil)