2016-04-14 3 views
0

をOBJの-Cのプロパティを呼び出す:このようなスウィフト延長でクラッシュこのObjective-Cのプロパティを使用しスウィフト拡張子から

@interface TSOnboardingPersonalizeViewController 
@property (nonatomic, weak) NSObject<PersonalizeContentCoordinatorDelegate> * _Nullable delegate; 
@end 

クラッシュ:

extension TSOnboardingPersonalizeViewController { 
    func next() { 
     self.delegate?.performAction(.Forward) 
    } 
} 

Poingののself.delegateを示しています

(lldb) po self.delegate 
▿ Optional<protocol<PersonalizeContentCoordinatorDelegate>> 
    ▿ Some : <MyApp.PersonalizeContentCoordinator: 0x8e964cf58140> 

プロパティをプロトコルタイプにキャストするとクラッシュしません。

extension TSOnboardingPersonalizeViewController { 
    func next() { 
     if let delegate = self.delegate as? PersonalizeContentCoordinatorDelegate { 
      delegate.performAction(.Forward) 
     } 
    }  
} 

Poingのデリゲートを示しています

(lldb) po delegate 
<MyApp.PersonalizeContentCoordinator: 0x7f86bcf59930> 

は、なぜ私は明示的にPersonalizeContentCoordinatorDelegateプロトコルタイプにプロパティをキャストする必要がありますか?

私はそれがデリゲートは、おそらくperformActionメソッドを持っていないNSObjectの、であるという事実に起因することができると思いスウィフト2.2とXcode 7.3

答えて

0

を使用しています。だから、デリゲートがObjective-Cのプロトコルに準拠しているにもかかわらず、Swiftはおそらくそのメソッドを含まないNSObjectを見ます。

Objective-CがSwiftに「このオブジェクトはこのプロトコルに準拠している」と伝えているので、これは「失われた翻訳」のようです。その後、実行されると、SwiftはNSObject上でそのメソッドを呼び出そうとしますが、明らかにそのメソッドは含まれず、クラッシュします。 Swiftに特定の型のオブジェクトがあることを伝えるまで、その型の特定のメソッドを実行することはできません(基本オブジェクトが実際にその型であっても)。

これはちょうど推測ですが、確かに一粒の塩で撮影する必要があります。

+0

SwiftはNSObjectと見なさず、<プロトコル>と見なします。 id を使用してもどちらも役に立ちません。 – Senior

関連する問題