ios - 依赖项注入(inject)通用结构,而无需重新指定占位符类型或约束

标签 ios swift xcode generics

我正在尝试将泛型结构依赖注入(inject)到类中,但我不想在类中再次重新指定泛型的占位符类型。这会失控,因为任何使用此类的类都必须不断地做同样的事情。

例如,这个有效:

struct SomeStruct<T : CustomStringConvertible> {
    let data: T
}

class SomeClass {
    let someStruct = SomeStruct(data: 1)
}

但是,如果我想将 struct 依赖注入(inject)到 class 中,我会得到一个错误:

struct SomeStruct<T : CustomStringConvertible> {
    let data: T
}

class SomeClass {
    let someStruct: SomeStruct
    //              ^
    // Reference to generic type 'SomeStruct' requires arguments in <...>

    init(someStruct: SomeStruct) {
    //               ^
    // Reference to generic type 'SomeStruct' requires arguments in <...>
        self.someStruct = someStruct
    }
}

那么我必须在 class 中再次指定占位符类型和类型约束:

struct SomeStruct<T : CustomStringConvertible> {
    let data: T
}

class SomeClass<T : CustomStringConvertible> {
    let someStruct: SomeStruct<T>

    init(someStruct: SomeStruct<T>) {
        self.someStruct = someStruct
    }
}

有什么方法可以避免在类中重新指定占位符类型和约束的需要吗?为什么类不能只知道 SomeStruct 包含 data: CustomStringConvertible

最佳答案

不,这是不可能的。您正在尝试描述一个允许指定具体 ( class) 类型的概念:

class SomeClass { ... }

但使用非具体类型作为成员

class SomeClass { 
    let someStruct: SomeStruct // <-- non-specified generic type, what placeholder should we use?
}

对于任何具体类型,它们的成员也必须是具体的

// OK
class SomeClass { 
    let someStruct: SomeStruct<Int>
}

而如果泛型成员的类型绑定(bind)到拥有类型 ( SomeClass) 本身的泛型类型持有者,则您可以允许泛型成员

// OK (assuming there is no type constraint on the
//     generic placeholder in the definition of SomeStruct)
class SomeClass<T> {
    let someStruct: SomeStruct<T>
}

最后,关于“重复”类型约束:如果某个给定类型的通用占位符,比如 SomeStruct<T>正如你的问题,在某种类型约束下,然后自然地(静态类型)任何类型持有者在泛型 SomeStruct 的使用中作为泛型类型说明符“传播”必须确保符合与应用于 SomeStruct 中通用占位符的约束相同的约束.因此,您无法避免在泛型类中指定相同的类型约束 SomeClass<T: ...> SomeStruct用作一般绑定(bind)成员。

struct SomeStruct<T : CustomStringConvertible> {
    let data: T
}

class SomeClass<T> {
    let someStruct: SomeStruct<T>
                            /* ^ this placeholder is not guaranteed to fulfil
                                 the type constraints which are applied to the
                                 generic typeholder of SomeStruct, hence the
                                 illegality */
}

关于ios - 依赖项注入(inject)通用结构,而无需重新指定占位符类型或约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693262/

相关文章:

swift - 无法创建函数数组

xcode - Mac 应用程序的设计 View

ios - Xcode 9 : Navigation item title of UIWebView is loaded after WebView is loaded

ios - 如果在 iOS 中禁用自动播放,Apple 的网站如何自动播放视频?

ios - 确定iOS中的WWAN连接类型

安卓和 iOS : How to develop for both?

swift - 在 swift 中使用 tableView(可扩展单元格)制作嵌套的 Accordion 菜单

ios - 如何通过 AppDelegate 升级使功能可用于大于 8 的 iOS

ios - Facebook iOS SDK 3.5 的 NSJSONSerialization 崩溃

Xcode 10 最近的项目无法正常工作