gpt4 book ai didi

Swift 泛型 : Constrain Type Parameter to Protocol

转载 作者:行者123 更新时间:2023-12-01 09:19:53 26 4
gpt4 key购买 nike

您如何指定泛型类型参数只能是协议(protocol)(或符合该协议(protocol)的协议(protocol)),而不是符合该协议(protocol)的类?

例如:

import Foundation

@objc protocol MyProtocol {
var name: String { get }
}

@objc protocol MySubProtocol: MyProtocol {
func foo()
}

class MyImplementation: MySubProtocol {
var name: String

init(name: String) {
self.name = name
}

func foo() {
print("Foo! Name: \(self.name)")
}
}

class InterfaceMaker<T: MyProtocol> {
init() {}

func makeInterface() -> NSXPCInterface {
return NSXPCInterface(with: T.self) // Cannot convert value of type 'T.Type' to expected argument type 'Protocol'
}


func getProxy() -> T? {
// Some magic in here involving `NSXPCConnection.remoteObjectProxy`
}
}

InterfaceMaker<MySubProtocol>().makeInterface() // No error, as expected
InterfaceMaker<MyImplementation>().makeInterface() // No error, but should not work!

如何指定泛型类型参数应该是协议(protocol)?

我要约束 T仅适用于符合 MyProtocol 的协议(protocol)(例如 MySubProtocol )。但问题是,我不知道如何防止 T 成为一个类(例如 MyImplementation )。

我已经尝试过约束 T.self (我试图使用 where T.self : Protocol ,但这导致了错误 'self' is not a member type of 'T' )。

那么如何指定 T必须是符合 MyProtocol 的协议(protocol),但不是一个类? 如果那不可能,我至少可以指定 T 应该是任何协议(protocol)吗?如果我需要制作 class-only protocol 也可以.

路过 MySubProtocol作为一个非通用参数不是我想要的,因为我还希望能够将该协议(protocol)用作 InterfaceMaker.getProxy() 的类型功能。此外,使用该函数只需返回 MyProtocol (换句话说, InterfaceMaker 是非泛型的)也不是一种选择。

注意 : 要完全清楚,我需要 T 的原因成为一个协议(protocol)是我要把它传递给 NSXPCInterface.init(with:) ,它需要一个 Protocol (如果 SomeProtocol.selfSomeProtocol,则可以通过 @objc 获得)。这意味着 SomeProtocol.self.Type是或符合

如果这是不可能的,请给出完整的解释原因。还要提及是否有可能在 future 的 Swift 版本中支持这一点。

编辑 : 另一种表达方式是 T.self is AnyObject.Type永远不应该是真的。我宁愿在编译时检查这一点,而不是运行时检查或断言。

最佳答案

您可以查看 T符合协议(protocol)AnyObject所有类都隐式符合,但不是协议(protocol)。

所以,在 InterfaceMaker :

class InterfaceMaker<T: MyProtocol> {
init() {}

func makeInterface() -> NSXPCInterface {
if T.self is AnyObject.Type {
// T is a class
} else {
return NSXPCInterface(with: T)
}
}


func getProxy() -> T? {
// Some magic in here involving `NSXPCConnection.remoteObjectProxy`
}
}

关于Swift 泛型 : Constrain Type Parameter to Protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47743519/

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