2017-10-31 22 views
2

構造体型を受け入れ、その関数内に作成したStructのインスタンスを返す関数を作成します。例えば構造体を関数に渡し、関数内にその構造体のインスタンスを作成します。

struct Person { 
    var name: String 
    func greet() { 
    print("Hi person \(self.name)") 
    } 
} 

struct Animal { 
    var name: String 
    func greet() { 
    print("Hi animal \(self.name)") 
    } 
} 

// T is the stuct type, so I can pass either Person or Animal. 
// name is the name string. 
func greet<T>(_ a: T, name: String) { 
    let thingToGreet: a = a(name: name) 
    thingToGreet.greet() 
} 

// Pass the struct type and a string. 
greet(Person, name: "Johny") 

これはさえ可能ですか? アプリケーションでは、URL、構造型を受け入れ、完了したらデータタスク要求に基づいて作成された構造体を返す関数を作成したいと考えています。

+0

を呼び出すこと... 'A'とどのような彼の 'T'何ですか? –

答えて

3

A)これらの型が.nameを持っていること、B).greet()の機能を持っていること、そして最後にC)はちょうどnameで初期化できることをコンパイラに説明する必要があります。 greet()グローバル機能では、プロトコルを参照します。最後のしわは、あなたがタイプに渡すことで、あなたは私が混乱していますinit(name:)明示的に...

protocol HasName { 
    var name: String { get set } 
    func greet() 
    init(name: String) 
} 

struct Person: HasName { 
    var name: String 
    func greet() { 
     print("Hi person \(self.name)") 
    } 
} 

struct Animal: HasName { 
    var name: String 
    func greet() { 
     print("Hi animal \(self.name)") 
    } 
} 

// ** We demand T follows the protocol, 
// ** & declare A is a type that follows the protocol, not an instance 
func greet<T: HasName>(_ A: T.Type, name: String) { 
    let thingToGreet = A.init(name: name) // ** A(name:) doesn't work 
    thingToGreet.greet() 
} 

// Pass the struct type and a string. 
greet(Person.self, name: "Johny") // ** .self returns the type 
+0

ありがとうございます。プロトコルが鍵となりました。今では、ジェネリックス、プロトコル、構造体についてより理解しています。 –

関連する問題