

ダウンキャストについてお尋ねします。  
以下のようにクラスを継承し、

[code]

    class CNMutableGroupKai: CNMutableGroup {
        var icon: String = ""
    }
    
[/code]

とし

[code]

    var groupData = group.mutableCopy() as! CNMutableGroupKai
    
[/code]

とダウンキャストしたいのですが失敗してしまいます。

おそらくは根本的なことを間違っていると思います。  
ご教授をお願いできませんでしょうか。


CC BY-SA 3.0
2016-07-10T13:10:17.240
27506
2017-10-17T08:18:46.623
2017-08-27T05:11:51.117
76
9153
question
swift
swiftでのダウンキャストについて


`mutableCopy()`はそのインスタンスの複製を作ります。`CNMutableGroupKai`では、`mutableCopy()`をオーバーライドしていないので、親クラスの実装が呼ばれ、`CNMutableGroup`の複製を作ります。

実体が`CNMutableGroup`であるものを、`CNMutableGroupKai`へキャストするのは不正ですので、`as!`でクラッシュするのは正当な挙動になります。

対処法としては、`mutableCopy()`を実装するということが考えられますが、

[code]

    class CNMutableGroupKai: CNMutableGroup {
        var icon: String = ""
    
        override func mutableCopy() -> AnyObject {
            let copy = CNMutableGroupKai()
            // identifierは読み取り専用なのでコピーできない
            // copy.identifier = self.identifier
            copy.name = self.name
            copy.icon = self.icon
            return copy
        }
    }
    
[/code]

そもそも、`CNMutableGroup`に独自のプロパティを追加しても、それは`CNContactStore`で保存することもできません（`CNMutableGroup`はグループ情報を操作して、保存するためにあるクラスです）し、推奨されない行為のように思えます。

連絡帳グループにそれを示すアイコンを持たせたい場合、Contactsフレームワークのクラスを拡張するよりも、ラッパーとなる構造体などを作った方が良いのではないでしょうか。

[code]

    struct GroupData {
        var icon: UIImage
        var group: CNGroup
    }
    
[/code]


CC BY-SA 3.0
2016-07-10T13:35:30.280
27507
2016-07-10T14:18:40.617
2016-07-10T14:18:40.617
5337
5337
27506
answer