1

の私のObjective-Cクラスの.hファイルで、私はこのようなNSIndexPathのためのカテゴリー作成しました:アクセスのObjective-Cカテゴリのプロパティ(関連する参照)スウィフト3の値タイプ

@interface NSIndexPath (YVTableView) 

@property (nonatomic, assign) NSInteger subRow; 

@end 

と、そのクラスの中を。今

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を使用してスウィフト3にNSIndexPathの副行プロパティにアクセスしていたとき:

Value of type 'IndexPath' has no member 'subRow'

メートルファイル、私はそのような実装しています

私は型キャスト

let subIndexPath = indexPath as NSIndexPath 
let subRowIndex = subIndexPath.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 

そのスウィフト2.xのと完全に細かい作業が、スウィフト3に移行した後、私はこの問題に直面しています。

+0

たぶん、あなただけのsubRow' 'に0以外の値を設定するのを忘れ?私はちょうどあなたのコードを試して、それは私のためにうまくいった。 –

+0

いいえ、Objective-C - > UITableViewDelegateのサブクラスに値がありません。カスタムデリゲートを使用して、Swiftクラスに渡しますが、Swift - > Custom Delegate実装に渡しています。私はこの問題に直面しています。 –

答えて

1

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

あなたはObjective-CのコードでNSIndexPathsubRowに値を設定している場合でも、そのNSIndexPathはスウィフトのIndexPathにキャストされたときに、値が失われます。そのため、IndexPathを再びNSIndexPathにキャストすると、subRowの値は常に0になり、デフォルト値になります。

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

func tableView(_ tableView: SKSTableView, cellForSubRowAt indexPath: NSIndexPath) -> UITableViewCell 
+0

私の問題の解決策は何ですか? Swift 3でObjective-Cコードを使用するにはどうすればよいですか? –

+0

私はちょうど答えを更新しました。あなたのSwiftカスタムデリゲートの実装では、 'IndexPath'の代わりに' NSIndexPath'としてパラメータ型を宣言してください。 –

+0

私はすでにカスタム代行の実装(Swiftコード)でIndexPathの代わりにNSIndexPathを使用しようとしましたが、「YVViewControllerのタイプがプロトコルに準拠していません。候補にはマッチしないタイプがあります。 –

1

次のようにして、しかし、あなたのカテゴリを更新することができます -

- (NSInteger)subRow 
{ 

    id myclass = [SKSTableView class]; 
    // id subRowObj = objc_getAssociatedObject(self, SubRowObjectKey); 
    id subRowObj = objc_getAssociatedObject(myclass, SubRowObjectKey); 
    return [subRowObj integerValue]; 
} 

- (void)setSubRow:(NSInteger)subRow 
{ 
    id subRowObj = [NSNumber numberWithInteger:subRow]; 

    id myclass = [SKSTableView class]; 
    // objc_setAssociatedObject(self, SubRowObjectKey, subRowObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    objc_setAssociatedObject(myclass, SubRowObjectKey, subRowObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
関連する問題