我会先给你一些背景知识.我正在try 创建一个函数,该函数接受任何符合协议(SomeProtocol)的类型作为参数.因此,我使用名为Currency的静态方法创建了一个 struct ,该 struct 符合SomeProtocol.Type,但是,在try 将该方法作为该泛型函数的参数传递时,我收到了这个错误:"静态成员‘Currency’不能用于协议元类型‘SomeProtocol.Type’".
我只是想重新创建这段SwiftUI代码:
Text(20.0, format: .currency(code: Locale.current.currency?.identifier ?? "USD"))
个
阅读文档,上面的函数是一个泛型init(),它接受符合某些协议的泛型类型.
init<F>(_ input: F.FormatInput, format: F) where F : FormatStyle, F.FormatInput : Equatable, F.FormatOutput == String
个
所以,.currency()
是一个来自FloatingPointFormatStyle.Currency
的静态方法,struct
符合FormatStyle
.
我的问题是,为什么这在SwiftUI中有效(将符合协议的 struct 中的静态方法作为参数传递给接受符合该协议的任何类型的函数),而不是在我自己的示例中:
protocol SomeProtocol {
associatedtype SomeType: SomeProtocol
var a: String { get }
var b: String { get }
static func currency(x: Int) -> SomeType
}
func someTest<T>(x: T) -> String where T: SomeProtocol{
return "this works!"
}
struct AnotherType: SomeProtocol {
let a = "Test"
let b = "someTest"
static func currency(x: Int) -> AnotherType {
return AnotherType()
}
}
someTest(x: .currency(x: 20))