在我的 Objective-C 类的 .h 文件中,我为 NSIndexPath 创建了一个类别,如下所示:
@interface NSIndexPath (YVTableView)
@property (nonatomic, assign) NSInteger subRow;
@end
在那个类的 .m 文件中,我已经实现了:
static void *SubRowObjectKey;
@implementation NSIndexPath (YVTableView)
@dynamic subRow;
- (NSInteger)subRow
{
id subRowObj = objc_getAssociatedObject(self, SubRowObjectKey);
return [subRowObj integerValue];
}
- (void)setSubRow:(NSInteger)subRow
{
id subRowObj = [NSNumber numberWithInteger:subRow];
objc_setAssociatedObject(self, SubRowObjectKey, subRowObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
现在,当我在 Swift 3 中使用 IndexPath 访问 NSIndexPath 的 subRow 属性时,它给了我错误:
“IndexPath”类型的值没有成员“subRow”
如果我尝试使用类型转换访问它
let subIndexPath = indexPath as NSIndexPath
let subRowIndex = subIndexPath.subRow
它总是将“0”作为“subRow”值返回给我。可能是因为 IndexPath 是值类型而 NSIndexPath 是引用类型。
我已经使用 Objective-C 将 UITableViewDelegate 实现到我的自定义委托并将其实现到 Swift 类,但是在我实现自定义委托方法的 Swift 中,我遇到了这个问题。
我还尝试在我的自定义委托实现(Swift 代码)中使用 NSIndexPath 而不是 IndexPath,但它给了我错误“Type YVViewController 不符合协议,Candidate has non matching-type”。
这是我的自定义代表声明:
@protocol YVTableViewDelegate <UITableViewDelegate>
@required
- (UITableViewCell *)tableView:(SKSTableView *)tableView cellForSubRowAtIndexPath:(NSIndexPath *)indexPath;
@end
它在 Swift 2.x 上运行得非常好,但是在迁移到 Swift 3 之后,我遇到了这个问题。