1

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 に移行した後、この問題に直面しています。

4

2 に答える 2

1

subRow関連付けられたは、同じ「オブジェクト」ではないため、キャストされたものNSIndexPathには関連付けられません。キーワードで定義された Swift の値型であるため、Objective-C に関連付けられたオブジェクトを持つことはできません。IndexPathNSIndexPathIndexPathstruct

subRowそのため、Objective-C コードで値を に設定したとしても、それが Swift の にキャストされるとNSIndexPath、その値は失われます。そのため、再度back をにキャストすると、値は常に 0 (既定値) になります。NSIndexPathIndexPathIndexPathNSIndexPathsubRow

あなたの場合、Swift でプロトコルを宣言し、インデックス パス パラメータ タイプを として指定する必要がありますNSIndexPath

func tableView(_ tableView: SKSTableView, cellForSubRowAt indexPath: NSIndexPath) -> UITableViewCell
于 2016-10-13T17:18:10.090 に答える