web-dev-qa-db-ja.com

Swift 3-列挙型の生の値をNSNotification.Nameとして使用する方法

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で動作します

任意の助けいただければ幸いです。

13
D. Greg

ここで、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)
    }
}
32
user6375148

私はこのようにしています。私にとっては、これは通知名を管理するより簡単な方法です。

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.
 }

このシンプルな方法がお役に立てば幸いです。

18
Gaurav Rami

私の知る限り、タイプはありませんでした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)
5
OOPer

多分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)
1
Reimond Hill