0

我试图弄清楚如何在一个类中隐式设置一个泛型(参数的类型)而不将整个类的类型更改为 SomeTestClass< SomeType> 之类的东西,其中对象的所有者必须知道通用的。

例子

这个例子不起作用!这就是我希望它的工作方式

protocol SomeTestProtocol {
    associatedtype T

    init(arg: T)
}

不想使用 SomeTestClass< T> 因为持有此类的类不知道所使用的泛型的类型

class SomeTestClass: SomeTestProtocol {
    required init(arg: T) {
    }

    // Use T outside the init-scope
}

注意:该协议只是一个变通方法的尝试!最终解决方案没有必要

所以主要问题是:如何在不使用类泛型的情况下在下面的类中在初始化范围之外使用 T ,这在拥有对象时必须知道

class SomeTestClass2/*< T>*/ {
    init(arg: T) {
    }

    // Use T outside the init-scope
}

谢谢你的帮助!

4

3 回答 3

0

重要说明,Tfromassociatedtype TTfrominit<T>可以是不同的类型。它们都定义了具有不同范围的泛型类型,并且可能不同。如果您希望它们相同,则 init 应该是

init(arg: T)

如果SomeTestClass总是要使用相同的类型,你可以添加

typealias T = Int // or something

或将 init 实现为

required init(arg: Int)

associatedtype T如果您从协议中摆脱它,它就会起作用。虽然这消除了SomeTestClass.T形式存在。

于 2018-12-05T18:58:20.303 回答
0

如果您在协议中声明关联类型,该类型将在协议的不同实现上成为通用类型,但每个符合标准的类都需要将具体类型分配给该关联类型作为 a typealias(这可以通过声明所有变量来隐式完成/函数使用具有相同具体类型的关联类型),因此您的符合类型将不是通用的。

如果您想在符合标准的类中使用泛型方法,则需要使类本身成为泛型。

于 2018-12-05T19:28:31.257 回答
0

如果您只想访问T外部init,那么您只需存储T在一个属性中:

class S {
    let theType: Any.Type
    init<T>(arg: T) {
        theType = T.self
    }
}

我怀疑您实际上想要的东西与您所说的想要的不同。我怀疑你想存储arg. 但如果是这样,如果你不知道它的类型是什么,你打算怎么做?arg你可以调用什么方法?它可以是什么函数的返回值?如果不诉诸as?,您将无能为力T(并且依赖as?通常意味着您误解了您的类型)。

所以你需要从你想要的方式TSomeTestClass被使用的方式开始。没有它,就不可能讨论T应该如何存储(如果你从不使用存储就无关紧要了)。

于 2018-12-05T19:49:13.243 回答