当前位置: 首页 > 面试题库 >

Swift泛型与上投

伯彦君
2023-03-14
问题内容

我有一个关于Swift中泛型的快速问题。问题是我试图存储一个以泛型为参数的变量,但是无法将其强制转换为它所限制的类型。最好在一个简短的示例中进行解释:

class Foo { }

class Thing<T: Foo> {
    func produceBar() -> Bar {
        return Bar(aThing: self as! Thing<Foo>)
    }
}

class Bar {
    var thing: Thing<Foo>

    init(var aThing: Thing<Foo>) {
        self.thing = aThing
    }
}

上面的代码产生错误: "Cast from Thing<T> to unrelated type Thing<Foo> always fails"

因为T被限制为Foo的子类,它 应该 永远不会 失败吗?我一定会误解泛型在Swift中的工作方式,任何指导或帮助将不胜感激!


问题答案:

Swift泛型不是协变的。就是说,错误确切说明了什么:即使是,您也无法自动说出a
Basket<Apple>是一种。这有充分的理由。Basket<Fruit>``Apple``Fruit

考虑以下代码:

class Fruit {}
class Apple: Fruit {}
class Orange: Fruit {}

class Basket<T: Fruit> {
    private var items: [T]
    func add(item: T) {
        items.append(item)
    }
    init() {}
}

func addItem<T: Fruit>(var basket: Basket<T>, item: T) {
    basket.add(item)
}

let basket:Basket<Apple> = Basket()

addItem(basket as Basket<Fruit>, Orange())

如果Basket<Apple>被视为Basket<Fruit>,这将是合法代码,并且允许我向一篮子苹果中添加橙子。



 类似资料:
  • Swift 4语言提供了泛型()功能来编写灵活且可重用的函数和类型。 泛型用于避免重复并提供抽象。 Swift 4标准库使用泛型代码构建。 Swift 4中的数组和字典类型属于泛型集合。 使用数组和字典,数组可定义为保存值和值或任何其他类型。 示例代码 当使用playground运行上述程序时,得到以下结果 - 泛型函数:类型参数 泛型函数可用于访问任何数据类型,如或。 当使用playground

  • Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出来的。 Swift 的数组和字典类型都是泛型集。 你可以创建一个Int数组,也可创建一个String数组,或者甚至于可以是任何其他 Swift 的类型数据数组。 以下实例是一个非泛型函数 exchange 用来交换两个 Int 值: 实例// 定义一个交换两个变量的函数 func swapTwoInts

  • 问题内容: 现在,我希望能够查看so中是否包含对象: 如果您发现此功能属于扩展名。问题是如果将其添加到此: 我收到以下错误: 找不到’==’的重载,该重载接受提供的参数 我了解我可能需要告诉什么样的对象应该在里面,例如:。但这还不起作用: 括号中的语句块是未使用的闭包 非标称类型’T []’无法 扩展 问题答案: 使用Swift时,我们需要考虑是否有一个 函数 可以解决问题-在类的方法之外。 就像

  • 问题内容: 我有一个简单的示例,它似乎应该工作: 因此,我们有一个名为的类,它符合协议,并定义了一个可选的类方法。 但是,这一行: 导致错误: 类型名称后的预期成员名称或构造函数调用 知道我在做什么错吗? 编辑 从声明中删除单词并稍微更改函数可以使代码得以编译,但是现在我遇到了运行时错误,指出 “快速动态投放失败” 问题答案: 我无法解释为什么您的代码会导致运行时异常。但是,如果您更改函数原型,它

  • 问题内容: 我正在编写一些Swift代码,其中有一个包含通用类型的数组: 稍后在我的代码中,我需要确定存储在数组中的类型。我尝试使用文档中描述的类型转换技术(尽管泛型没有使用过)。 上面的switch语句在编译时导致以下错误: 发出IR SIL功能@ _TFC19Adder_Example Mac6Matrix9transposeUS 7ElementfGS0_Q__FT_GSqGS0_Q___以

  • 问题内容: 我正在尝试基于指定的泛型类型进行强制转换和/或生成一个变量。我知道并没有快速的类型擦除,但是除了泛型的指定条件(例如符合基类)外,泛型似乎并没有保留类型。看来我可以强制转换或初始化的只是基类。更奇怪的是,当我在调试器中时,泛型似乎对正确的类具有RawPointer,甚至变量看起来都像是正确的类型: 编辑: 从Xcode 6.1开始,这仍然是一个问题(简化的代码由Gregory Higl