如何编写实现访问类型属性的泛型函数



我正试图在函数体中编写一个泛型函数,它读取Type的一个属性。

我的功能:

func doSomething<Key>(
_ key: Key
) -> Int  {
let a = key.aProperty
return doSomethingElse(a)
}

我给doSomething放了不同的结构,只要它们的属性之一是"aProperty">

struct A {
let a : String
let aProperty: String
}
struct B {
let b : String
let aProperty: String
}
let a = A()
let b = B()
doSomething<A>(a)
doSomething<B>(b)

但我在doSomething函数中遇到编译器错误,称"Key"类型的值没有成员"aProperty"。

那么你能告诉我在定义doSomething函数时缺少了什么吗?

您可以使用协议。


func doSomethingElse(_ a: String) -> Int { 0 }
protocol HasAProperty {
var aProperty: String { get }
}
func doSomething<Key: HasAProperty>(
_ key: Key
) -> Int  {
let a = key.aProperty
return doSomethingElse(a)
}
struct A: HasAProperty {
let a : String
let aProperty: String
}
struct B: HasAProperty {
let b : String
let aProperty: String
}
let a = A(a: "a", aProperty: "aProperty")
let b = B(b: "b", aProperty: "aProperty")
doSomething(a)
doSomething(b)

最新更新