如何将 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)
我觉得写
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)