gpt4 book ai didi

swift - 如何从通用函数返回值作为协议(protocol)的实现?

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:29 25 4
gpt4 key购买 nike

我想构建一个协议(protocol)映射到实现这些协议(protocol)的对象。然后我希望能够获得给定协议(protocol)的实现。

这是我目前所得到的:

class Services {
var map = NSMapTable(keyOptions: .CopyIn, valueOptions: .WeakMemory)

func register<T>(type: T, target: AnyObject) {
map.setObject(target, forKey: String(type))
}

func get<T>(type: T) -> AnyObject {
guard let target = map.objectForKey(String(type)) else {
fatalError("Not registered")
}
return target
}
}

我可以这样调用它:

protocol Foo {
func qux()
}

class Bar: Foo {
func qux() {}
}

services.register(Foo.self, target: Bar())

那太好了。但是当我想取回它时:

let foo: Foo = services.get(Foo.self)

...上面的行产生一个错误:

Foo.swift:12:34: Cannot convert call result type 'AnyObject' to expected type 'Foo'

如何指定通用函数 get 返回一个对象,该对象实现了 T 中引用的协议(protocol)?

我想避免在通话时强制转换。

最佳答案

我不确定这是否适合您的目的,但您可以这样写:

class Services {
var map = NSMapTable(keyOptions: .CopyIn, valueOptions: .WeakMemory)

func register<T>(type: T.Type, target: T) {
guard let object = target as? AnyObject else {
fatalError("Cannot register")
}
map.setObject(object, forKey: String(type))
}

func get<T>(type: T.Type) -> T {
guard let target = map.objectForKey(String(type)) as? T else {
fatalError("Not registered")
}
return target
}
}

关于swift - 如何从通用函数返回值作为协议(protocol)的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com