2016-04-14 69 views
0

使用这种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协议类型?

我使用雨燕2.2与7.3的Xcode

回答

0

我认为这可能是由于该委托是一个NSObject,这可能不具有performAction方法。所以,即使委托符合Objective-C中的协议,Swift可能会看到一个NSObject(不包括该方法)。

这看起来像是一个“迷失在翻译中”的东西,其中Objective-C告诉Swift“这个对象符合这个协议。”然后在执行时,Swift会尝试在NSObject上调用该方法,该方法明显不包含该方法并崩溃。这可以解释为什么转换可以工作,因为直到你告诉Swift你有一个特定类型的对象,它不能执行任何类型的特定方法(即使底层对象实际上是那种类型)。

这只是一个猜测,虽然和绝对应该采取一粒盐(也许更好的答案,如果有人来)。

+0

Swift没有将其视为NSObject,它将其视为>。使用id 也没有帮助。 – Senior