将 Objective-C 对象向下转换为 Swift 类型失败(静默)
Downcasting Objective-C object to Swift type fails (silently)
已讨论 ;相似但不完全相同。
MyView
是 UIImageView
的 Swift 子类。它编译并且它的界面出现在 DerivedData/.../*-Swift.h
文件中。但是在 Obj-C 中向下转换失败。代码:
MyView* myView = (MyView*)viewThatCameFromIB;
// The Custom Class declared in IB inspector as MyView.
Xcode 变量查看器中这一行的结果:
myView UIImageView * 0x7fc8e9417e00
这行代码执行没有失败。但可以肯定的是,尝试在 myView
变量上使用 MyView
功能会因未知选择器而崩溃。由于在 Obj-C 中转换成功,在 MyClass
被移植之前,它 应该 也应该在移植之后,n'est-ce pas?
我试过了:
- 删除并重置 IB 中的自定义 Class 以防万一。
- 将这行代码分成多个步骤。
现在这个有效:
- 直接用
init()
方法实例化一个 MyView
也就是说,我得到了一个MyView
实例:
myView _TtC12YadaYada11MyView * 0x7f8bc05487d0
(因此,我可以想到一个解决方法:编写一个 Swift MyView
构造函数,它接受 UIImageView
并使用它来构造自身。但我不应该必须.这不就是落魄者在幕后做的事吗?)
问题似乎是通过在身份检查器的自定义 Class 部分清除(设置)MyView
视图的 Inherit Module From Target
布尔值引起(修复)的。至少在从头开始的测试用例中。在我的特定移植挑战中,有 3,000 多个文件(和 50 多个 MyView
s),可能存在混杂因素。但现在,这就是答案。
已讨论
MyView
是 UIImageView
的 Swift 子类。它编译并且它的界面出现在 DerivedData/.../*-Swift.h
文件中。但是在 Obj-C 中向下转换失败。代码:
MyView* myView = (MyView*)viewThatCameFromIB;
// The Custom Class declared in IB inspector as MyView.
Xcode 变量查看器中这一行的结果:
myView UIImageView * 0x7fc8e9417e00
这行代码执行没有失败。但可以肯定的是,尝试在 myView
变量上使用 MyView
功能会因未知选择器而崩溃。由于在 Obj-C 中转换成功,在 MyClass
被移植之前,它 应该 也应该在移植之后,n'est-ce pas?
我试过了:
- 删除并重置 IB 中的自定义 Class 以防万一。
- 将这行代码分成多个步骤。
现在这个有效:
- 直接用
init()
方法实例化一个MyView
也就是说,我得到了一个MyView
实例:
myView _TtC12YadaYada11MyView * 0x7f8bc05487d0
(因此,我可以想到一个解决方法:编写一个 Swift MyView
构造函数,它接受 UIImageView
并使用它来构造自身。但我不应该必须.这不就是落魄者在幕后做的事吗?)
问题似乎是通过在身份检查器的自定义 Class 部分清除(设置)MyView
视图的 Inherit Module From Target
布尔值引起(修复)的。至少在从头开始的测试用例中。在我的特定移植挑战中,有 3,000 多个文件(和 50 多个 MyView
s),可能存在混杂因素。但现在,这就是答案。