Swift 将结构传递给函数,并在函数内创建该结构的实例

Swift 将结构传递给函数,并在函数内创建该结构的实例,swift,function,generics,struct,Swift,Function,Generics,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 typ

我想创建一个接受结构类型的函数,在该函数中,我想返回所创建结构的实例

例如:

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")
struct-Person{
变量名称:String
func{
打印(“Hi person\(self.name)”)
}
}
结构动物{
变量名称:String
func{
打印(“Hi animal\(self.name)”)
}
}
//T是stuct类型,所以我可以通过人或动物。
//name是名称字符串。
func问候语(a:T,名称:String){
让事物自由:a=a(名称:name)
thingToGreet.greet()
}
//传递结构类型和字符串。
问候(人,名字:“约翰尼”)
这可能吗?
在应用程序中,我想创建一个接受URL的函数,一个结构类型,然后在完成时我想返回根据数据任务请求创建的结构。

您需要使用协议向编译器解释,a)这些类型有一个
.name
,B)它们有一个
.greet()
函数,最后,C)它们可以仅用
名称
初始化。在
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
协议名称{
变量名称:字符串{get set}
func
init(名称:String)
}
结构人:HasName{
变量名称:String
func{
打印(“Hi person\(self.name)”)
}
}
结构动物:HasName{
变量名称:String
func{
打印(“Hi animal\(self.name)”)
}
}
//**我们要求T遵守协议,
//***声明A是遵循协议的类型,而不是实例(&D)
func greet(A:T.Type,name:String){
让thingToGreet=A.init(名称:name)/**A(名称:)不起作用
thingToGreet.greet()
}
//传递结构类型和字符串。
问候(Person.self,name:“Johny”)/**。self返回类型

我很困惑。。。什么是
a
,什么是他的
T
?谢谢。协议是关键,现在我对泛型、协议和结构有了更多的了解。