【问题标题】:Dynamically (generic) inherit from <T> in swift动态(通用)从 <T> 快速继承
【发布时间】:2015-07-14 11:30:38
【问题描述】:

我没有找到任何解决方案,很有可能这是不可能的,但我会试一试(如果不可能,我很乐意得到一个小的解释)。

我正在尝试在 Swift 中创建一个类,我们称之为 Foo,我希望 FooChild 继承自 Foo。到目前为止,没有任何问题。问题是,我希望 Foo 动态继承“任何类”,可能是通过泛型类型。

类似

class Foo<T> : <T>{

}

class FooChild : Foo<NSObject> {

}

class FooChild2 : Foo<UIview> {

}

我希望 FooChild 和 FooChild2 都从 Foo 继承,但我希望 foo 从 NSObject 继承一次,从 UIView 继承一次(示例中使用随机类)。

这可能吗?即使在我会以某种方式桥接的 Objective-C 代码中。

【问题讨论】:

标签: ios objective-c swift templates generics


【解决方案1】:

Swift 1.2

不,这是不可能的。

你可以做的是这样的:

protocol Foo { }

class FooChild1: NSObject, Foo { }

class FooChild2: UIView, Foo { }

斯威夫特 2

是的,现在这是可能的。

非泛型类可以从泛型类继承。 (15520519)

参见:Xcode 7 Beta Release Notes,“Swift 2.0 和 Objective-C 中的新功能”一章,“Swift 语言特性”一节

例如以下是可能的:

import UIKit

class Foo<T> { }

class FooChild: Foo<NSObject> { }

class FooChild2: Foo<UIView> { }

let fooChild = FooChild()

let fooChild2 = FooChild2()

另外,在 Swift 2 中,如果您需要 Swift 1.2 示例中的协议 Foo 来提供一些默认行为,您可以使用默认协议实现。

您可以使用协议扩展为该协议的任何方法或属性要求提供默认实现。如果符合标准的类型提供了它自己的所需方法或属性的实现,则将使用该实现而不是扩展提供的实现。

请参阅:The Swift Programming Language,“协议”一章,“提供默认实现”部分

【讨论】:

  • 谢谢,你知道如果我在 FooChild 上问“is Foo”它会返回 true 吗?
  • 是的,它会返回true。从文档的同一章(请参阅我的答案中的链接):“您可以使用类型转换中描述的isas 运算符来检查协议一致性,并转换为特定协议。”跨度>
猜你喜欢
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 2018-03-10
  • 1970-01-01
  • 2023-03-29
  • 2018-03-13
相关资源
最近更新 更多