タグ付けされた質問 「swift-protocols」

6
「純粋な」Swiftで弱いプロトコル参照を作成するにはどうすればよいですか(@objcなし)
weakprotocolがとして宣言されていない限り、参照はSwiftで機能しないよう@objcです。これは、純粋なSwiftアプリでは不要です。 このコードはコンパイルエラーを発生させます(weak非クラスタイプには適用できませんMyClassDelegate): class MyClass { weak var delegate: MyClassDelegate? } protocol MyClassDelegate { } プロトコルの前にを付ける必要があります@objc。そうすると機能します。 質問:を実現する「純粋な」Swiftの方法はweak delegate何ですか?


7
配列型および関数パラメーターとしてのプロトコルの迅速な使用
特定のプロトコルに準拠したオブジェクトを格納できるクラスを作成したい。オブジェクトは型付き配列に格納する必要があります。Swiftのドキュメントによると、プロトコルはタイプとして使用できます。 タイプであるため、次のような他のタイプが許可されている多くの場所でプロトコルを使用できます。 関数、メソッド、または初期化子のパラメーター型または戻り型として 定数、変数、またはプロパティのタイプとして 配列、辞書、またはその他のコンテナー内のアイテムのタイプとして ただし、次の場合はコンパイラエラーが発生します。 プロトコル 'SomeProtocol'は、Selfまたは関連する型の要件があるため、一般的な制約としてのみ使用できます これをどのように解決しますか? protocol SomeProtocol: Equatable { func bla() } class SomeClass { var protocols = [SomeProtocol]() func addElement(element: SomeProtocol) { self.protocols.append(element) } func removeElement(element: SomeProtocol) { if let index = find(self.protocols, element) { self.protocols.removeAtIndex(index) } } }

3
プロトコルはそれ自体に準拠していませんか?
このSwiftコードがコンパイルされないのはなぜですか? protocol P { } struct S: P { } let arr:[P] = [ S() ] extension Array where Element : P { func test<T>() -> [T] { return [] } } let result : [S] = arr.test() コンパイラーは、「タイプPがプロトコルに準拠していませんP」(または、Swiftの以降のバージョンでは、「プロトコル 'P'に準拠する具体的なタイプとして 'P'を使用することはサポートされていません。」)と述べています。 何故なの?これはどういうわけか、言語の穴のように感じます。問題はarr、配列をプロトコルタイプの配列として宣言することに起因することを認識していますが、それは不合理なことですか?タイプ階層のようなものを構造体に提供するのに役立つプロトコルは正確にあると思いましたか?

2
「プロトコル…自己または関連する型の要件があるため、一般的な制約としてのみ使用できます」とはどういう意味ですか?
Swiftのカスタムプロトコルをキーにしたディクショナリ(実際にはHashSet)を作成しようとしていますが、タイトルにエラーがあります。 プロトコル 'myProtocol'は、Selfまたは関連する型の要件があるため、一般的な制約としてのみ使用できます 頭も尻尾も作れません。 protocol Observing: Hashable { } var observers = HashSet<Observing>()

3
「@objc」以外のメソッドは、「@ objc」プロトコルのオプションの要件を満たしていません
概要: 私はObjective-Cオプション機能の1つのデフォルト実装を提供するプロトコルP1を持っています。 オプション機能のデフォルト実装を提供すると警告が表示されます コンパイラの警告: Non-'@objc' method 'presentationController(_:viewControllerForAdaptivePresentationStyle:)' does not satisfy optional requirement of '@objc' protocol 'UIAdaptivePresentationControllerDelegate' バージョン: スウィフト:3 Xcode:8(公開リリース) 試み: 追加しようとし@objcたが役に立たない 質問: これをどのように解決しますか? 回避策はありますか? コード: @objc protocol P1 : UIAdaptivePresentationControllerDelegate { } extension P1 where Self : UIViewController { func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? { return …

5
プロトコルにはSelfまたはassociatedType要件があるため、ジェネリック制約としてのみ使用できます。
私はプロトコルRequestTypeを持っていて、それは以下のようにassociatedTypeモデルを持っています。 public protocol RequestType: class { associatedtype Model var path: String { get set } } public extension RequestType { public func executeRequest(completionHandler: Result<Model, NSError> -> Void) { request.response(rootKeyPath: rootKeyPath) { [weak self] (response: Response<Model, NSError>) -> Void in completionHandler(response.result) guard let weakSelf = self else { return } if …

5
Swiftでは、1つ以上のプロトコルに準拠する特定の型の変数をどのように宣言できますか?
Swiftでは、次のように宣言することで、変数の型を明示的に設定できます。 var object: TYPE_NAME さらに一歩踏み込んで、複数のプロトコルに準拠する変数を宣言する場合は、protocol宣言型を使用できます。 var object: protocol<ProtocolOne,ProtocolTwo>//etc 1つ以上のプロトコルに準拠し、特定の基本クラス型でもあるオブジェクトを宣言したい場合はどうなりますか?Objective-Cの同等の機能は次のようになります。 NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...; Swiftでは、私はそれが次のようになることを期待します: var object: TYPE_NAME,ProtocolOne//etc これにより、プロトコルで定義された追加のインターフェイスだけでなく、基本型の実装にも柔軟に対応できるようになります。 私が見逃しているもっと明白な方法はありますか? 例 例として、UITableViewCellプロトコルに準拠したセルを返す責任があるファクトリーがあるとします。プロトコルに準拠したセルを返す汎用関数を簡単に設定できます。 class CellFactory { class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T { //etc } } 後で、タイプとプロトコルの両方を活用しながら、これらのセルをデキューしたい var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell テーブルビューセルがプロトコルに準拠していないため、これはエラーを返します... セルがaでUITableViewCellありMyProtocol、変数宣言のに準拠していることを指定できますか? …

15
列挙型をSwiftのプロトコルに準拠させる方法は?
Swiftのドキュメントでは、クラス、構造体、列挙型はすべてプロトコルに準拠していると記載されており、それらがすべて準拠するようになりました。しかし、列挙型をクラスや構造体の例のように動作させることはできません。 protocol ExampleProtocol { var simpleDescription: String { get set } mutating func adjust() } class SimpleClass: ExampleProtocol { var simpleDescription: String = "A very simple class." var anotherProperty: Int = 69105 func adjust() { simpleDescription += " Now 100% adjusted." } } var a = SimpleClass() a.adjust() let aDescription …

4
「致命的なエラー:アレイをObjective-Cからブリッジできません」—Swiftを試してみたのはなぜですか?
私はSwiftプロトコルを宣言しました: protocol Option { var name: String { get } } このプロトコルの複数の実装(一部のクラス、一部の列挙型)を宣言します。 次のように宣言されたプロパティを持つビューコントローラーがあります。 var options: [Option] = [] このプロパティをOption別のVCのプロトコルを実装するオブジェクトの配列に設定しようとするとprepareForSegue、ランタイムエラーが発生します。 fatal error: array cannot be bridged from Objective-C なぜこれが機能しないのですか?コンパイラーには必要なすべての情報があり、Objective-Cがそれとどう関係しているのかまったくわかりません。私のプロジェクトにはSwiftファイルのみが含まれており、これらの配列は、それらをブリッジする必要がありますNSArray。


9
自己を返すプロトコル関数
オブジェクトのコピーを返すプロトコルPがあります。 protocol P { func copy() -> Self } Pを実装するクラスC: class C : P { func copy() -> Self { return C() } } ただし、Self次のエラーが発生したときに戻り値を入力するかどうか。 タイプ「C」の戻り値の型をリターンタイプ「Self」に変換できません 私も戻ってみましたC。 class C : P { func copy() -> C { return C() } } その結果、次のエラーが発生しました。 非最終クラス「C」のメソッド「copy()」はSelf、プロトコル「P」に準拠するために戻る必要があります 私は接頭辞の場合を除き、何も作品class Cにfinalすなわち操作を行います。 final class C : P …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.