Ios 斯威夫特:“我的名字叫什么?”;“无法识别的选择器”;当访问存在的属性时

Ios 斯威夫特:“我的名字叫什么?”;“无法识别的选择器”;当访问存在的属性时,ios,objective-c,swift,Ios,Objective C,Swift,我正在导入一个用Objective C编写的旧库,作为Swift项目的子模块。 当尝试访问该库对象的属性时,应用程序崩溃,出现“无法识别的选择器”异常 这是目标C类的代码: @interface MotionzoneItem : NSObject<NSCopying> @property (nonatomic, copy) NSString *title; @property (nonatomic, readonly) NSString *describe; @property (

我正在导入一个用Objective C编写的旧库,作为Swift项目的子模块。 当尝试访问该库对象的属性时,应用程序崩溃,出现“无法识别的选择器”异常

这是目标C类的代码:

@interface MotionzoneItem : NSObject<NSCopying>

@property (nonatomic, copy) NSString *title;
@property (nonatomic, readonly) NSString *describe;
@property (nonatomic, assign) BOOL move, enabled;
@property (nonatomic, assign) CGRect frame;
@property (nonatomic, readonly) CGPoint point0, point1, point2, point3;
@property (nonatomic, readonly) CGPoint leftTop, rightTop, rightBottom, leftBottom;
@property (nonatomic, readonly) CGPoint selectedPoint;
@property (nonatomic, strong) UIColor *handleColor;
@property (nonatomic, assign) NSUInteger index;

- (CGPoint)getSelectedPointWithRect:(CGRect)targetFrame;
- (CGRect)getCircleFrameWithPoint:(CGPoint)targetPoint;
- (void)updateFrame:(CGPoint)targetPoint;
- (void)resetItem;

@end
看起来一切正常,但在代码中,当我尝试执行此命令时:

let motionzoneItem: MotionzoneItem = MotionzoneItem.init()
motionzoneItem.handleColor = UIColor.red
引发异常,说明:
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[MotionzoneItem handleColor]:未识别的选择器发送到实例0x1742ed700'

如果我通过检查器检查对象,我可以看到很多属性未包含在对象中:

其他属性在哪里,如handleColor或title

谢谢

注意:如果我执行的代码与用Objective C编写的代码相同,而不是Swift,那么它就可以工作。

修复了

最后,清理项目并删除派生数据文件夹中的所有内容可以解决问题。现在一切正常,我可以看到所有MotionzoneItem属性


很抱歉,这可能会给您带来不便,非常感谢您的帮助。

Hmm.您是否100%确定这是有问题的行,因为在这种情况下,您会收到“-[MotionzoneItem setHandleColor:]:无法识别的选择器发送到…”消息(注意,错误中是
setHandleColor
,而不是
handleColor
)。错误是它找不到
handleColor
,但您不能在这一行中调用它。您正在调用
setHandleColor
…关键在
”-[MotionzoneItem handleColor]:
我认为显示更多代码会有所帮助???我建议您创建一个,因为如果我们无法复制它,我们很难帮助您。我们不需要看到所有的
MotionzoneItem
。创建项目的副本,删除所有不相关的内容(例如除
handleColor
相关内容外的所有内容),并确保您仍然可以重现问题。只是确认一下,您的
@实现中没有类似
@dynamic handleColor
的内容,是吗?这样可以防止为您合成访问器方法。(同样,如果您这样做了,如果从Objective-C调用它,它将不起作用。)Re:动态属性,您没有理由认为因为对象公开了一个属性,所以它将该属性存储在值中。内存中没有可识别值的
handleColor
title
,这并不意味着什么。当你打电话给
handleColor
时,你会说“尽你所能给我把手颜色”。您没有说“我要求您现在必须获取并返回一个存储值”。我对2个属性(objc)也有同样的问题,当从swift访问此属性时,它会导致崩溃:
[\uu NSCFNumber length]:发送到实例的无法识别的选择器
let motionzoneItem: MotionzoneItem = MotionzoneItem.init()
motionzoneItem.handleColor = UIColor.red