2016-10-10 4 views
-2

私はロジックとオブジェクトの名前を共有する両方のプラットフォームでほぼ同じアプリを持っています。しかし、コードは別のものですから、一緒に持っていきたいと思います。iOSとMacOSの間でコードを共有する - NSTextFieldとUITextField

私はできるだけ論理を統合して、メンテナンスを容易にしようとしています。ユーザインターフェイスの定義を除き、私のコードのすべてを共有する:しかし、私は私がやりたいことができますどのような方法がありますiOSの上で私は

result.text = valueString 

を使用して、MacOSの中でそれが

result.stringValue = valueString 

ですか?私はカメレオンを見ましたが、それはこれまで伸びていないようです。

答えて

-1

見つかりました。本当に明白な、あなたは特定の構文が何であるかを知っていれば...

#if os(iOS) 
    result.text = valueString 
#else 
    result.stringValue = valueString 
#endif 
+0

面白いですが、それをコンパイルするには 'result'の型は何でしょうか?私はそれがあなたを助ける方法を見ません。それは単に問題をさらに戻すだけです( 'result'自体の宣言に)。それは最終的には何も「統合」しません。 – matt

+0

だから気づいた。理論はうまくいっていますが、#ifブロックを使って関数の全バージョンをコピーして貼り付けることができます。私はCobolでそれを行う方法を正確に知っています! –

0

私は両方のクラスは、それに準拠したプロトコルは、テキストアクセサとして働き作成します。

protocol TextAccess { 
    func getText() -> String? 
} 

extension UITextView: TextAccess { 
    func getText() -> String? { 
     return text 
    } 
} 

extension NSTextField: TextAccess { 
    func getText() -> String? { 
     return stringValue 
    } 
} 

そのように、あなただけの.getText()を呼び出します特定のアクセサーを呼び出すタイプのいずれかを選択します。上記のコードを#ifブロックにラップする必要があるかもしれませんが、これはこの問題にアプローチする方法の大まかな例です。

別のアプローチは、エイリアスを作成するには、次のようになります。

#if os(iOS) 
    typealias TextField = UITextField 
#endif 
#if os(macOS) 
    typealias TextField = NSTextField 
#endif 

どこでもあなたはTextFieldにアクセスするには、プラットフォーム固有のクラスにアクセスします。

関連する問題