0

構造体に依存する戻り値の型が異なるだけの同じメソッド名を持つ個々の拡張機能でプロトコル準拠が生成されるいくつかの迅速な構造体があります。それに加えて、ジェネリック型のプロトコル準拠関数を呼び出すジェネリック関数でそれらを使用したい)。//: 遊び場 - 名詞: 人が遊べる場所

import UIKit

protocol FooProt {
typealias T;
static func createMe<T>()->T;
}


struct FooStruct{

}


extension FooStruct: FooProt{
typealias T = FooStruct;
static func createMe  () -> FooStruct{
    return  FooStruct();
}

}


class Creator{
fun  createOne<T where T:FooProt>(type:T.Type){
   let instance  =  T.createMe();
} 

}

残念ながら、次のエラーが発生します: /var/folders/sn/78_zvfd15d74dzn01mdv258h0000gq/T/./lldb/3741/playground6.swift:7 :17: 注: プロトコルにはタイプ ' () -> T の関数 'createMe()' が必要です' (別名 '<τ_1_0> () -> τ_1_0') static func createMe()->T;

ここで正確に準拠していないものは何ですか?回避策はありますか?

4

2 に答える 2

2

コードにはいくつかの問題があります。一方では、関連付けられたタイプでプロトコルを定義しました。ただし、 createMe() メソッドを他のタイプを使用するジェネリックとして定義します。それはあなたの意図ではないと思います。あなたの意図は、プロトコルに関連付けられた型と同じ型を返す createMe() メソッドを持つことだったと思います。この場合、 createMe() メソッドから を削除する必要があります。また、 createMe() という名前は、型を返すだけでなく、このメソッドが呼び出されているオブジェクトの型を返すことを意味します。この場合、関連付けられたタイプのプロトコルさえ必要ありません。コードを少し単純にすることを可能にする Self 制約を持つプロトコルが必要なだけです。Creator の createOne メソッドでは、型制約が必要以上に複雑です。

次のコードが必要だと思います:

protocol FooProt {
    static func createMe()->Self;
}


struct FooStruct{
}


extension FooStruct: FooProt {
    static func createMe() -> FooStruct {
        return FooStruct();
    }
}


class Creator{
    func createOne<T:FooProt>(type: T.Type) -> T {
        return T.createMe()
    }
}


let foo = Creator().createOne(FooStruct.self)
于 2015-11-19T15:08:33.020 に答える
1

これは、静的メソッドの代わりにプロトコルで初期化子を使用する代替ソリューションです。

protocol FooProt {
    init()
}


struct FooStruct{
}


extension FooStruct: FooProt {
}


class Creator{
    func createOne<T:FooProt>(type: T.Type) -> T {
        return T.init()
    }
}


let foo = Creator().createOne(FooStruct.self)
于 2015-11-19T15:13:26.683 に答える