2017-01-21 9 views
-4

SwiftプロジェクトをObjective-Cに変換します。私がフォローコードを変換するとき、私はそれが正しいか間違っているのか分からない。この構文を変換する方法SwiftをObjective-Cに変換する

スウィフト

let closest = layoutAttributes.sorted { 
    abs($0.center.x - proposedContentOffsetCenterOrigin) < abs($1.center.x - proposedContentOffsetCenterOrigin) 
}.first ?? UICollectionViewLayoutAttributes() 

のObjective-C

UICollectionViewLayoutAttributes *closest = [[layoutAttributes sortedArrayUsingComparator:^NSComparisonResult(id a, id b) { 
    return 
     fabsf([(UICollectionViewLayoutAttributes*)a center].x - proposedContentOffsetCenterOrigin) 
     < 
     fabsf([(UICollectionViewLayoutAttributes*)b center].x - proposedContentOffsetCenterOrigin); 
}] firstObject]; 
+1

あなたのアプローチの問題点は何ですか?私。質問は何ですか? – shallowThought

+0

私には妥当だと思われますが、証拠はテスト中です。それはコンパイルされますか?それは実行時にあなたが期待することをしますか? –

答えて

2

あなたは、コードを少し簡略化することができます。また、戻り値はObj-Cで異なる必要があります。

UICollectionViewLayoutAttributes *closest = [[layoutAttributes sortedArrayUsingComparator:^NSComparisonResult(UICollectionViewLayoutAttributes *a, UICollectionViewLayoutAttributes *b) { 
    CGFloat distanceA = ABS(a.center.x - proposedContentOffsetCenterOrigin); 
    CGFloat distanceB = ABS(b.center.x - proposedContentOffsetCenterOrigin); 

    if (distanceA < distanceB) { 
     return NSOrderedAscending; 
    } else if (distanceA > distanceB) { 
     return NSOrderedDescending; 
    } 

    return NSOrderedSame; 
}] firstObject]; 

スウィフト?? UICollectionViewLayoutAttributes()?: [[UICollectionViewLayoutAttributes alloc] init];として翻訳されるだろうが、あなたの配列が空がない場合は、その必要はありません。

+0

聞いてください。このコードは、読みやすくすることができます。 Swift版も同様のクリーンアップパスを使用できます。 –

+0

@DuncanC Obj-Cでは、ブロック署名のパラメータタイプを変更できることは明らかではありません。 – Sulthan

+0

あなたのサポートのおかげで、それは私のために明確になります。 –

関連する問題