gpt4 book ai didi

objective-c - 从 Swift 扩展调用 Obj-C 属性时发生崩溃

转载 作者:行者123 更新时间:2023-11-30 13:30:22 26 4
gpt4 key购买 nike

使用此 Objective-C 属性:

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

在 Swift 扩展中崩溃,如下所示:

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

POing self.delegate 显示:

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

但是如果我将属性转换为协议(protocol)类型,它不会崩溃:

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

POing 代表显示:

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

为什么我需要将属性显式转换为 PersonalizeContentCoordinatorDelegate 协议(protocol)类型?

我使用的是 Swift 2.2 和 Xcode 7.3

最佳答案

我认为这可能是因为委托(delegate)是一个 NSObject,它可能没有 performAction 方法。因此,即使委托(delegate)符合 Objective-C 中的协议(protocol),Swift 也可能会看到一个 NSObject(它不包含该方法)。

这看起来像是“迷失在翻译中”之类的事情,Objective-C 告诉 Swift“这个对象符合这个协议(protocol)”。然后,在执行时,Swift 会尝试在 NSObject 上调用该方法,而 NSObject 显然不包含该方法并崩溃。这可以解释为什么强制转换会起作用,因为除非你告诉 Swift 你有一个特定类型的对象,否则它无法执行该类型的任何特定方法(即使底层对象实际上是该类型)。

不过,这只是一个猜测,绝对应该持保留态度(如果有的话,也许是一个更好的答案)。

关于objective-c - 从 Swift 扩展调用 Obj-C 属性时发生崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com