問題タブ [swift-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Swiftの「拡張機能」に相当するJavaは何ですか?
公式の Swift ドキュメント ( Swift extension doc ) によると、Swift 拡張機能は Java 列挙型のように見えます。
これを Java で表現しようとしたところ、次のコードが思いつきました。この Java 表現は正しいですか? またはこれを表す他の方法はありますか?
swift - 静的プロトコル拡張により、不正な命令のコンパイラ エラーが生成される
Swift で利用可能な拡張機能について調べましたが、静的protocol extensions
がサポートされているかどうか疑問に思っていましたか? でインスタンスメソッドを使用できることを知っていますprotocol extension
。
そのリポジトリの実装とともに、リポジトリのプロトコルを作成したいと考えていました。
リポジトリ プロトコル
リポジトリの実装
次に、アプリケーション内で疎結合を維持するために、ファクトリを介してリポジトリを作成したいと考えました。私は巧妙になり、次のように静的メソッドをプロトコルにアタッチしようとしていました。
ここにキーワードをドロップすればこれができることはわかっていますがstatic
、本当に静的にしたかったので、これを行うことができました:
リポジトリの実装を変更したい場合は、プロトコル拡張ファクトリ メソッドを更新することで実行できます。もう 1 つの方法は、これを処理する実際のファクトリを作成することですが、型自体にファクトリ メソッドが存在するというアイデアが気に入っています。
これをコンパイルすると、次のコンパイラ エラーが表示されます。
シグナルが原因でコマンドが失敗しました: 不正な命令: 4
警告: 不変値 'repository' の初期化は使用されませんでした。'_'への割り当てに置き換えるか、それを削除することを検討してくださいrepository = noterepositoryprotocol.createinstance()~~~~^~~~~~~~~ _/library/caches/com.apple.xbs/ソース/swiftlang/swiftlang-700.0.38.1/src/swift/lib/SILGen/SILGenExpr.cpp:3311! 0 swift 0x0000000106760e0b llvm::sys::PrintStackTrace(__sFILE*) + 43 1 swift 0x000000010676154b SignalHandler(int) + 379 2 libsystem_platform.dylib 0x00007fff9440ef1a _sigtramp + 26 3 swift 0x0000000106d5aa2e FirstTarget + 60550 4 swift 0x0000000106761346 abort + 22 5 swift 0x000000010671ae21 llvm: :llvm_unreachable_internal(char const*,
プロトコル拡張で静的メソッドを使用できませんか?
アップデート
サンプル ソースの問題の根本を改善するために、単体テスト アサーションを削除しました。問題は、プロトコルで静的メソッドを呼び出すことをコンパイラが好まないことです。
ios - IBInspectable を使用した選択状態の UIButton 境界線の色
次のようなSwift拡張機能を使用して@IBInspectable
、境界線の色を設定するために使用しています:UIButton
...しかし、ボタンselectedBorderColor
の状態のプロパティも必要です。.Selected
これは、このような拡張機能で可能ですか? UIButton
代わりに、ボタンの状態をサブクラス化してチェックする必要がありますか?
前もって感謝します。
swift - パラメータの代わりに戻り値の型を要求する拡張関数
カスタムフォントを返すUIFontの拡張機能をSwiftで作成しています。
ただし、拡張機能を使用すると、self.titleLabel?.font = UIFont.museoSansRounded900(15.0)
Xcode は設計時にエラーを返します。'(CGFloat) -> UIFont' is not convertible to 'UIFont'
私は何か間違ったことをしていますか?拡張機能の関数を使用している場合、Xcode は実際には CGFloat ではなくパラメーターとして UIFont を要求しています。
swift - プロトコル拡張で初期化子を定義する方法は?
self.wheels = wheel でエラーが発生します
プロトコル拡張で初期化子を定義するにはどうすればよいですか?
swift - where句を使用したSwift配列拡張がサブプロトコルで機能しない
Swift 2 (Xcode 7b4) で動作すると思われるコードをいくつか書きましたが、コンパイルされていません。私がやろうとしていることが有効であるかどうかについて、いくつかの考えを得たいと思っています。
Array
次の拡張例を検討してください。
まず、要素が である配列とはどういう意味AnyObject
ですか? 基本的に、配列には、インスタンスの等価性 ( ) を比較できる非値型オブジェクトの異種グループを含める必要があると言っています===
。
例の関数appendUniqueInstance()
は、要素がまだ配列にない場合にのみ、要素を配列に挿入します。これは操作に似ていますが、明らかに順序付けを提供し、(さらに重要なことに)の同種型要件をSet
insert()
課しません(の の使用による)。Set
Equatable
Self
を実装するプロトコルP
とクラスを定義すると、次のようになります。C
P
をインスタンス化しますC
:
let c = C()
次に、これらの非常に明白なことが真実です。
そして、次のことができるようになりました。
ここまでは順調ですが、問題のケースについては次のとおりです。
ここで、a2
は の配列として型付けされているため、 のインスタンスP
に対して行うことは完全に有効なはずであり、実際に行は期待どおりに機能します。append
P
a2.append(c)
Array
ただし、拡張関数を呼び出すとappendUniqueInstance()
、コンパイラ エラーが発生します。
私が知る限り、コンパイラは何に渡すことができるかについて混乱しているようappendUniqueInstance()
で、C
(via P
) がAnyObject
.
P
ちなみに、代わりに次のように宣言すると:
@objc protocol P : AnyObject {}
その後、すべてが正常にコンパイルされますが、プロトコルのすべてが にP
準拠していることも確認する必要があります@objc
。これは私が望んでいるものではありません。
結局のところ、私の質問は次のとおりです。これはうまくいくように見えますか? 宣言の構文が間違っているだけではないことを願っていますが、そうであればうれしいと思います。
swift - Swift で where 句を使用して配列型を拡張する
Accelerate フレームワークを使用して [Float] と [Double] を拡張したいのですが、それぞれに異なる実装が必要です。
私は明白なことを試しました:
次のエラーが表示されます。
「制約付き拡張機能は、'where' 句で指定された制約を使用して、特殊化されていないジェネリック型 'Array' で宣言する必要があります」
このようにSwift 2でジェネリック型を拡張することは可能ですか?
コードが期待どおりに機能するようになりました。Accelerate フレームワークを使用した合計を示す例を次に示します。
ios - 複雑な Swift 拡張機能
Python のように添え字演算子を介して部分文字列を取得できるようにする Swift の String クラスの拡張機能を作成したいと考えています。これは、次の方法で Range クラスを使用して実現できます。
これにより、次の使用法が可能になります
ただし、負の整数を使用して、文字列の末尾と先頭からインデックスを作成できるようにしたいと考えています。
Range クラスは上記の拡張startIndex
を超えることを許可しないendIndex
ため、この動作を実現するには不十分です。
Range オブジェクトは明らかにこの拡張機能には使用できないため、Python と同じ構文を単純に使用するのが理にかなっています。
これは可能ですか?どうすればこれを行うことができますか?