0

(Xcode5で)NSUIntegerを取る「MutableArray」に「removeObjectAtIndex」を使用しようとしていますが、使用している変数は整数であるため、(NSUInteger *)でキャストしましたが、キャストするという警告が表示されます小さい整数型からの「NSUInteger *」(別名 unsigned long *)。警告を保持するためにコード内で変数「second」をキャストしていませんが、これも整数です

-(void) moveObjectAtIndex:(NSUInteger *)oldIndex toNewIndex:(NSUInteger *)newIndex{
    id *member = [self.array objectAtIndex:*oldIndex];
    [self.array removeObjectAtIndex:*oldIndex];
    if ((NSInteger)newIndex >=(self.array.count)) {
        newIndex--; //i casted newIndex because I got a warning about ordered comparison of NSUInteger with NSInteger (I'm not sure if this is best solution)
    }
    [self.array insertObject:member atIndex: *newIndex];
}

-(void)moveObjectInArray:(NSMutableArray *)array{
    [array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];
}
4

3 に答える 3

-1

次のステートメントでは

if ((NSInteger)newIndex >=(self.array.count))

あなたはNSIntegerへのポインタを型キャストしています。そのはず

if ((NSInteger)*newIndex >=(self.array.count))

それでも、型キャストには注意が必要であり、符号付き/符号なしの変換やデータ損失による結果に注意する必要があります。

また、この行には

[array moveObjectAtIndex:(NSUInteger *) first toNewIndex:second];

の型はまたは 同じサイズであるfirst必要があります。NSUInteger *long は 64 ビット環境では 64 ビットであり、小さいポインター型から大きいポインター型への型キャストは未定義の動作をもたらすことに注意してください。についても同様secondです。1 つの解決策は、一時変数を使用してから結果をコピーすることです。

于 2014-02-21T04:58:52.933 に答える