2016-05-29 7 views
0

私のプロジェクトでLinqToObjectiveCという名前のライブラリを使用しましたが、今すぐ迅速なファイルに使用したいと思います。このライブラリは複雑なobjective-Cマクロを使用しますが、これらのマクロは迅速にアクセスできません。私は迅速に、たとえば、このマクロを変換する方法を知りたい:複雑なObjective-Cマクロを即座に変換する

#define LINQKey(__key) (^id(id item){return [item valueForKey:@#__key];})

+1

これがすべてではない複雑で、あなたは簡単な関数を使用することができますマクロを使用する必要はありません。 – Sulthan

答えて

1

まずはそのマクロが何をしているかを説明しましょう。

それは(@#)をstringifies、__keyと呼ばれる引数を取り、パラメータとしてオブジェクトを取り、item.valueForKey(key)の結果を返すであろうクロージャ(ブロック)を返します。

文字列をSwiftに変換することはできませんが、Obj-Cでも使用しないでください。 LINQKey(@"myKey")の場合、なぜLINQKey(myKey)になるのでしょうか?クロージャを返す単純な関数として

func LINQKey(key: String) -> (AnyObject! -> AnyObject!) { 
    return { (item: AnyObject!) in 
     return item.valueForKey(key) 
    } 
} 
+0

詳細な回答をいただきありがとうございます。作者は、ユーザーが任意の文字列の代わりにオブジェクトのプロパティを渡すことを望んでいたため、文字列を使用しています。あなたの変換は機能していません。予想される引数型LINQSelectorに変換できないと文句を言う!テストしてもよろしいですか? –

+1

'LINQSelector'はちょうど' typedef'です。あなたの問題を解決するはずのオプションを '!'に更新しました。しかし、このようなライブラリをSwiftで使用することは非常に面倒です。それは完全な迅速な書き換えを取得する必要があります。 – Sulthan

+0

これをどのように変換できますか: '#define LINQSel(__ key)(^ id(id item){return [item __key];})'ここで__keyは文字列ではありません! –

関連する問題