21482


下記のようにすると、  
「Cannot convert value of type 'UInt8' to expected aegument type 'AnyObject?'」  
というエラーが出てしまいます。

`let obj:UInt8 = 0  
NSNotificationCenter.defaultCenter().postNotificationName("test", object: obj,
userInfo: nil)  
`

[code]

    class TestObj {
       var test:UInt8=0
    }
    ~~~
    let obj = TestObj()
    obj.test = 1
    NSNotificationCenter.defaultCenter().postNotificationName("test", object: obj, userInfo: nil)
    
[/code]

上記のようにしたことで通知は可能なのですが、  
なぜUINT8は直接指定できないのか理解できておらず、この方法が正しいのかがわかりません…。  
この方法は回りくどい、こうするのが通常手段…などなどありましたらご意見いただけないでしょうか。


CC BY-SA 3.0
2016-01-29T12:44:40.030
21480
2016-01-29T13:29:58.390
12842
question
swift2
NSNotificationCenter.defaultCenter().postNotificationNameの引数にUINT8型が指定できない


まずUInt8が使用できない理由ですが、エラーメッセージの通りで、「'UInt8'型の値は引数として期待されている'AnyObject?'型には変換できません」です。  
`AnyObject`(または`AnyObject?`)に変換可能な数値型は限られていて、こちらに記載があります。(ちなみに他にもあります。)  
[Numbers](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-ID67)  
要は整数型だと`Int`と`UInt`だけが`NSNumber`に自動的に変換されて、それは`AnyObject`としても取り扱えますよ、ということです。(この自動変換が有効になるのは、(間接的にでも良いので)Foundationをimportしている時だけです。)  
試しに`UInt8`を`Int`か`UInt`に変更して、元のコードをコンパイルしてみてください。

次に「こうするのが通常手段」の部分ですが、`postNotificationName(_:object:userInfo:)`メソッドのリファレンスでは、object引数のことをこう記載しています。  
[postNotificationName(_:object:userInfo:)](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/#//apple_ref/occ/instm/NSNotificationCenter/postNotificationName:object:userInfo:)  
_notificationSender  
The object posting the notification._  
「この通知を投函するオブジェクト」ってことですね。通常、通知の発行は何かしらのメソッドの実行中に行われるものと思いますので、よほどの例外的なことをしているので無い限りobject引数には必ず`self`を指定します。それ以外の何かの情報を伝えたいときにはuserInfoに渡すディクショナリーに適当なキーで値を入れておくわけです。ただしその場合でも、`UInt8`型の値は(`[NSObject:
AnyObject]`型であるuserInfo)ディクショナリーには直接入れられませんが。


CC BY-SA 3.0
2016-01-29T13:17:21.203
21482
2016-01-29T13:29:58.390
2016-01-29T13:29:58.390
13972
13972
21480
answer