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
ここで、IndexPath を使用して Swift 3 の NSIndexPath の subRow プロパティにアクセスすると、エラーが発生します。
タイプ 'IndexPath' の値にメンバー 'subRow' がありません
型キャストを使用してアクセスしようとしている場合
let subIndexPath = indexPath as NSIndexPath
let subRowIndex = subIndexPath.subRow
「subRow」値として常に「0」を返します。IndexPath が値型で NSIndexPath が参照型であるためかもしれません。
Objective-C を使用してカスタム デリゲートに UITableViewDelegate を実装し、それを Swift クラスに実装しましたが、カスタム デリゲート メソッドを実装している Swift では、この問題に直面しています。
また、カスタム デリゲートの実装 (Swift コード) で IndexPath の代わりに NSIndexPath を使用しようとしましたが、「タイプ YVViewController がプロトコルに準拠していません。候補には一致しないタイプがあります」というエラーが表示されました。
これが私のカスタムデリゲート宣言です:
@protocol YVTableViewDelegate <UITableViewDelegate>
@required
- (UITableViewCell *)tableView:(SKSTableView *)tableView cellForSubRowAtIndexPath:(NSIndexPath *)indexPath;
@end
Swift 2.x では問題なく動作しますが、Swift 3 に移行した後、この問題に直面しています。