Xcode 8ベータ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で動作します
任意の助けいただければ幸いです。
ここで、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)
}
}
私はこのようにしています。私にとっては、これは通知名を管理するより簡単な方法です。
Swift 3.0およびXcode 8.
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.
}
このシンプルな方法がお役に立てば幸いです。
私の知る限り、タイプはありませんでしたNSNotification.Name
in Swift 2.2.1/SDKがXcode 7.3.1にバンドルされているので、どのように機能させたのか知りたいです。
とにかく、列挙型を利用したい場合は、次のように書く必要があります。
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 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)