問題タブ [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.

0 投票する
1 に答える
215 参照

oop - 必須の初期化子を実装する必要があるサブクラスに必須のプロパティを追加するにはどうすればよいですか?

これがシナリオです。A、、、の 3 つのクラスがBありCます。クラスAは のサブクラスですB。クラスCは、そのインスタンス変数の 1 つをクラスに渡す必要がありますA(それを と呼びましょうb)。がnilである状況に遭遇しないようにするために、C初期化時にそれが発生することを確認したいと思います。との構造は次のとおりです。AbAB

Swift の規則では、オプションではない、または暗黙的にラップ解除されていない変数は、初期化時に定義する必要があると規定されています。ただし、B の init を実装する必要があるため (B を制御することはできません。Apple から提供されています)、A の初期化子に追加のパラメーターを追加できないため、それを保証することはできません。

A(b)A がorA(a,b)で呼び出されていることを確認したいのですがA(a)、 b が初期化されていることを確認します。解決策を探したり、プロトコルや拡張機能を使用した解決策を考えたりしましたが、わかりませんでした。私が答えにたどり着いたのはこの答えによるものですが、それは私が望むことを実際には行いません。

2 つの質問があります (一方は他方を無効にします): 1. [明らかなもの] これに対する解決策はありますか? (本当に明らかな何かが欠けているのでしょうか?) 2. 私はこれに間違ったアプローチをしていますか? 私が使用すべき別のパターンはありますか?

ありがとう!

0 投票する
1 に答える
1787 参照

ios - タイプ `Int` の不変値には、adjust という名前の変更メンバーのみがあります

私は今、Swift言語を学んでいます。

Apple のドキュメントでは、次のような拡張の例を見ました。

だから私はちょうどadjust()好きを呼んだ:

エラーがスローされます:

迅速なエラー

エラーの原因がわかりません。問題を理解するのを手伝ってくれる人はいますか?

0 投票する
1 に答える
192 参照

swift - ジェネリック パラメータ句を使用する場合

私は迅速にジェネリックを初めて使用し、いくつかの本を読んでいるときに、理解できないものに出くわしました。ジェネリック関数では、いつ型パラメーター (関数名の直後) を使用するのが適切ですか? そしてそれが不適切なのはいつですか?

これが使用されていない例 (署名のみ; 標準ライブラリから):

これが使用されている場所の例です(私が読んでいる本から取られました):

Apple の迅速な言語リファレンス、セクション: Generic Parameters and Arguments を読みました。しかし、それはまだ私には明らかではありません。洞察をお寄せいただきありがとうございます。  

0 投票する
1 に答える
1227 参照

objective-c - Swift 拡張機能がオーバーロードされたメソッドを Objective-C クラスに追加できない

Swift 拡張機能を使用してオーバーロードされたメソッドを Objective-C クラスに追加すると、最初のメソッドしか呼び出されないように見え、実行時に予期しない動作やクラッシュが発生します。(Objective-C ではなく) Swift クラスの拡張機能は正しく機能します。これに対する回避策があるかどうかを確認し、これがバグであることを確認し、Apple に報告する必要があることを確認したいと思います。Swift がサポートしているのに対し、Objective-C はオーバーロードされたメソッドをサポートしていないことを考えると、この 2 つを混在させると問題が発生する可能性があると想像できます。

拡張機能を取得するクラスは、init 関数を持つ Objective-C クラスを除いて、両方とも空です。ObjClass は .h および .m ファイル内で宣言され、Swift ブリッジ ヘッダーを使用してインポートされます。元の SwiftClass は、Swift 拡張機能と共にコード サンプル内で定義されています。

次に、文字列、int、およびオブジェクトを使用してオーバーロードされたメソッドを呼び出します。

ObjClass の場合、すべてのメソッド呼び出しは Int32 型の最初のメソッドに対して行われます。COpaquePointerを使用すると、これがオブジェクト ポインターに関連していることがわかりますが、少し異なります。

Swift クラスの Swift Extension は期待どおりに動作します。

うまくいけば、これはある時点でサポートされる可能性があります。それまでは、予期しない動作やクラッシュが発生するのではなく、コンパイル時に失敗するはずです。これに対して提案する回避策はありますか?

次のように、ObjClass 拡張メソッドを交換するかのように、最初のメソッドを呼び出していることがわかります。

次に、への呼び出しは正常にobjClass.log(str)機能しますが、への呼び出しはobjClass.log(10)次のようになります。

0 投票する
1 に答える
488 参照

swift - Swiftでジェネリックを使用して拡張機能でオプションのクラスメソッドを使用してプロトコルを使用するには?

次のようなクラスメソッドを持つ既存のクラスの拡張機能を使用しようとしています:

そして、私はこのプロトコルを次のような一般的な拡張機能で使用しています:

これは機能するはずですが、ビルドすると、Xcode は「コマンド /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1」と表示します。プロトコルで「オプション」を使用しない場合、拡張機能で foo() をアンラップする必要はなく、「セルフ」を削除してもすべてが正常に機能します。オプションを適切に機能させる理由と方法を誰か教えてもらえますか? 前もって感謝します。

0 投票する
1 に答える
2413 参照

iphone - Swift の高さ変更での向きの変更と、横向きでの uibutton の非表示

モバイルの向きが変更されたときに横向きに1つのボタンを非表示にする必要があるカスタムキーボードを1つ作成しています。これを行う方法を提案してください。以下のコードを使用してこのタスクを実行しています。横向きでもボタンが表示されます横向きではボタンを非表示にし、縦向きモードでは表示したい

0 投票する
1 に答える
1202 参照

swift - NSManagedObject の Swift 拡張機能

Objective-C でこれを行うことができますが、Swift で機能させる方法を理解するのに苦労しています。新しいエンティティを作成したいときにいつでも簡単に関数を呼び出せるように、NSManagedObject の拡張機能を作成しています。次に、関数は既存のエンティティの一致をチェックし、一致がない場合、関数は新しいエンティティを作成して返します。一致する場合は、一致を返します。これが私のコードです:

  • 「i_d」はエンティティの一意の ID です

これは、Objective-C でこのようなものを呼び出すことができた方法です (大まかに翻訳):

var chap: Chapter = Chapter.createChapter(...)のようなものを試すたびに、Xcode では別の Chapter オブジェクトをパラメーター リストに入れることしかできませんが、Chapter インスタンスから関数を呼び出そうとすると、関数パラメーターがいっぱいになる可能性があります。元気で。

問題を解決するにはどうすればよいですか?

編集:

回答の提案から、関数定義の前に「クラス」を配置し、関数に初期変数を正しく作成し、必要な場所に疑問符を追加して、コードを修正しました。

0 投票する
1 に答える
643 参照

swift - 空の拡張子で @objc プロトコルへの準拠を宣言すると、EXC_BAD_INSTRUCTION で壊れます

アレイと組み合わせた Swift プロトコルで多くの問題を抱えていましたが、問題が遊び場で壊れ始める前に、問題全体を再現することさえできませんでした。これは最小限の例です。

Bus2 つのプロトコルと、いずれかのプロトコルへの準拠を宣言するクラスがあります。さらに、 の空の拡張はBus、他のプロトコルへの準拠を宣言します。

コンソール出力はランダムに見えるかもしれませんが、そうではありません。のインスタンスを作成しようとすると、一貫して取得されますBus:

  • @objcすべての属性をコメントアウトすると、エラーはなくなります
  • 準拠していない場合、エラーはなくなりUtterableます。extension Bus: Utterable{}

私のプロトコルに属性が必要な理由@objcは、そうしないと Obj-c ランタイムが次のようなことをしようとしたときに文句を言っvar myDisplayables: [Displayable] = [ Bus() ]たり、プロトコルへの準拠を動的にチェックしたりするためです。

繰り返しますが、これは最小限の例であることに注意してください。

Swift 1.2 で更新: 現在は修正されているようです。Xcode は、「プロトコルが必要とするため」、これらの変更を提案しています。