Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?
Posted
技术标签:
【中文标题】Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?【英文标题】:Swift 3 - How to use enum raw value as NSNotification.Name? 【发布时间】:2016-08-11 06:46:57 【问题描述】:我正在使用 Xcode 8 beta 5,我正在尝试设置这样的通知枚举
enum Notes: String
case note1
case note2
然后尝试将它们用作通知名称
NotificationCenter.default.post(name: Notes.note1.rawValue as NSNotification.Name,
object: nil, userInfo: userInfo)
但我遇到了一个错误。
Cannot convert value of type 'String' to specified type 'NSNotification.Name'
有解决办法,还是我错过了什么?它适用于 Xcode 7.3.1
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:给你,使用 Swift 3 和 Xcode 8.0
enum Notes: String
case note1 = "note1"
case note2 = "note2"
var notification : Notification.Name
return Notification.Name(rawValue: self.rawValue )
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.post(name: Notes.note2.notification ,object: nil, userInfo: nil)
另一种方式
import UIKit
extension Notification.Name
enum MyNames
static let Hello = Notification.Name(rawValue: "HelloThere")
class ViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.post(name: Notification.Name.MyNames.Hello ,object: nil, userInfo: nil)
【讨论】:
我认为没有理由将 'enum MyNames' 放在 'extension Notification.Name' 中。这毫无意义。【参考方案2】:我正在这样做,对我来说这是管理通知名称的更简单的方法。
Swift 3.0 和 Xcode 8.0
使用 Notification.Name 的扩展,我们可以在其中定义静态名称,如下所示。
extension Notification.Name
static let newPasscodeSet = Notification.Name("newPasscodeSet")
static let userLoggedIn = Notification.Name("userLoggedIn")
static let notification3 = Notification.Name("notification3")
我们可以这样使用这些名称:
override func viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(self.newPasscodeSetAction), name: .newPasscodeSet, object: nil)
func newPasscodeSetAction()
// Code Here.
希望这个简单的方法对你有所帮助。
【讨论】:
【参考方案3】:据我所知,在 Xcode 7.3.1 中捆绑的 Swift 2.2.1/SDK 中没有类型 NSNotification.Name
,所以我很好奇你是如何让它工作的。
无论如何,如果你想利用你的枚举,你需要写这样的东西:
NotificationCenter.default.post(name: NSNotification.Name(Notes.note1.rawValue),
object: nil, userInfo: userInfo)
顺便说一句,我最好的建议是定义自己的 Notification.Name
是使用定义静态属性的扩展:
extension Notification.Name
static let note1 = NSNotification.Name("note1")
static let note2 = NSNotification.Name("note2")
(它比枚举长一点...,但是)你可以这样使用它:
NotificationCenter.default.post(name: .note1,
object: nil, userInfo: userInfo)
【讨论】:
你是对的。 Swift 2.2 中没有NSNotification.Name
。我的意思是我可以只用原始值分配通知名称。我应该更清楚。
@D.Greg,感谢您的澄清。如您所知,Swift 测试版的变化如此之快,我担心我可能会遗漏一些东西。【参考方案4】:
也许是 swift 4.2 中的另一种方法
extension Notification.Name
struct RecordListNotification
static let recordListDidChange:Notification.Name = Notification.Name("recordListDidChange")
static let recordListTimeDidChange = Notification.Name("recordListTimeDidChange")
然后
NotificationCenter.default.post(name: Notification.Name.RecordListNotification.recordListTimeDidChange, object: nil)
也是为了避免冗长:
typealias RecordListNotification = Notification.Name.RecordListNotification
而且可以使用:
NotificationCenter.default.post(name: RecordListNotification.recordListTimeDidChange, object: nil)
【讨论】:
谢谢。您还可以创建、构造和定义静态通知名称以上是关于Swift 3 - 如何使用枚举原始值作为 NSNotification.Name?的主要内容,如果未能解决你的问题,请参考以下文章