代码之家  ›  专栏  ›  技术社区  ›  Michael_mhr

隐式设置关联类型

  •  0
  • Michael_mhr  · 技术社区  · 6 年前

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

    protocol SomeTestProtocol {
        associatedtype T
    
        init(arg: T)
    }
    

    不想使用SomeTestClass<t> 不知道使用的泛型的类型

    class SomeTestClass: SomeTestProtocol {
        required init(arg: T) {
        }
    
        // Use T outside the init-scope
    }
    

    所以 is:如何在下面的类的init作用域之外使用T而不使用泛型类(在拥有一个对象时必须知道它)

    class SomeTestClass2/*< T>*/ {
        init(arg: T) {
        }
    
        // Use T outside the init-scope
    }
    

    谢谢你的帮助!

    3 回复  |  直到 6 年前
        1
  •  0
  •   Craig Siemens    6 年前

    重要提示 T associatedtype T 以及 init<T> 可以是不同的类型。它们都定义了一个具有不同作用域的泛型类型。如果您希望它们是相同的,那么init应该是

    init(arg: T)
    

    SomeTestClass 总是要使用同一类型,可以添加

    typealias T = Int // or something
    

    或者将init作为

    required init(arg: Int)
    

    如果你把 关联类型 SomeTestClass.T

        2
  •  0
  •   Dávid Pásztor    6 年前

    如果您在协议中声明一个关联类型,那么该类型将在协议的不同实现上变为通用类型,但是每个一致性类都需要为该关联类型指定一个具体类型,作为 typealias

    如果你想在一致性类中有泛型方法,你需要使类本身成为泛型。

        3
  •  0
  •   Rob Napier    6 年前

    如果你只想进入 T 外部 init ,然后你只需存储 T 在属性中:

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

    arg . 如果是的话,你打算怎么办 具有 精氨酸 如果你不知道它的类型是什么?你能叫什么方法?它的返回值是什么函数?不用求助于 as? T 作为?

    所以你需要从你想要的开始 T SomeTestClass 待使用。没有这些,就不可能讨论如何 应该被储存起来(如果你从来没有使用过它,那么这个储存就不重要了)。