###前提・実現したいこと
特定の親クラスを継承、プロトコルを準拠したサブクラスからプロトコルのプロパティにアクセスできない
###発生している問題・エラーメッセージ
EXC_BAD_ACCESS (code=1, address=0x0).
###該当のソースコード
swift
1protocol MyProtocol where Self: OyaClass { 2 var protocolPropaty: String {get} 3} 4 5class OyaClass: UIView { 6} 7 8class KoClass1: OyaClass, MyProtocol { 9 var protocolPropaty: String { 10 return "KoClass1" 11 } 12} 13class KoClass2: OyaClass, MyProtocol { 14 var protocolPropaty: String { 15 return "KoClass2" 16 } 17} 18 19class CreateClass { 20 static func createKoClass(para: Int) -> MyProtocol? { 21 switch para { 22 case 1: 23 return KoClass1() 24 case 2: 25 return KoClass2() 26 default: 27 return nil 28 } 29 } 30} 31 32class SomeClass { 33 var array = Array<MyProtocol>() 34 35 func createKoClass(para: Int) { 36 if let koClass = CreateClass.createKoClass(para: para) { 37 array.append(koClass) 38 } 39 } 40 41 func someMethod() { 42 for element in array { 43 print(element.protocolPropaty) 44 } 45 } 46} 47 48var someClass = SomeClass() 49someClass.createKoClass(para: 1) 50someClass.createKoClass(para: 2) 51someClass.someMethod()
KoClass1
, KoClass2
はそれぞれOyaClass
をスーパークラスとして継承し、MyProtocol
プロトコルに準拠しています。
CreateClass.createKoClass
はKoClass1
, KoClass2
いずれも返せるように返り値の型をMyProtocol
としています。
上記ソースの最終行someClass.someMethod()
を実行した際のMyProtocol
のprotocolPropaty
へのアクセス時にEXC_BAD_ACCESS (code=1, address=0x0).
が発生してしまいます。
また、KoClass1
, KoClass2
の親クラスであるUIView
やOyaClass
のプロパティにもアクセスできるようにしたいと考えています。
そのためにはCreateClass.createKoClass
の返り値、SomeClass.array
の型をOyaClassを継承し、MyProtocolに準拠したクラス
と定義すべきと考えているのですが、どのようにすべきでしょうか。
###補足情報(言語/FW/ツール等のバージョンなど)
Xcode 9.1
swift 4.0.2
Playground
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/04 14:08 編集