Swift 泛型和向上转型

2024-02-21

我有一个关于 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"

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


Swift 泛型不是协变的。也就是说,正是错误所说的:你不能自动说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>,并且我可以在一篮子苹果中添加一个橙子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 泛型和向上转型 的相关文章

  • 带有自定义 init 的 SwiftUI 视图

    假设我正在制作一个如下所示的自定义输入元素 struct CustomInput View Binding var text String var name String var body some View TextField name
  • iOS 中系统日期更改后如何更改带有日期的标签?

    我有一个简单的查询 但不知道该怎么做 这就是我想要实现的目标 1 我有一个带有今天日期的 UILabel 即 29 04 12 2 在午夜 我希望该标签自行更新为 30 04 12 而无需更改视图或按任何内容 这是第2步 我不知道该怎么做
  • 从 iOS 设备向 Google App Engine 进行身份验证

    我正在开发一个 iPhone 应用程序 它使用 Google 应用程序引擎来托管后端 我需要通过 Google 进行身份验证 但我似乎无法找到从我的应用程序中执行此操作的方法 看来我要做一个UIWebView让用户登录到我从 Google
  • 如何使用群组在 iPhone 和 Apple Watch 之间共享数据?

    我是 Watchkit 开发新手 无法找到在 iPhone 和 iWatch 之间共享数据的解决方案 请帮助我 我希望使用组来共享数据 我们可以使用组在 iPhone 和 iWatch 之间传递数据 基本上iWatch不能做任何处理 我们需
  • UILongPressGestureRecognizer 不起作用,但将其替换为 UITapGestureRecognizer 效果很好。为什么?

    我有一个UIImageView with a UILongPressGestureRecognizer无论我如何配置手势识别器 似乎都不会检测到长按手势 但是 如果我把它换成UITapGestureRecognizer that工作得很好
  • 在 iOS Safari 上滚动后锚点失去点击能力

    使用它来获取点击次数 nav li a click function event event preventDefault target this attr href replace goToByScroll target 这是滚动功能 f
  • 如何计算CLLocationDistance的中心坐标

    我想计算我的位置和一些注释之间的中心点 到目前为止我已经这样做了 CLLocation myLoc self locMgr location MKPointAnnotation middleAnnotation locationV anno
  • 如何设置 UINavigationbar 的渐变颜色?

    我想设置UINavigationbar backgroundColor渐变颜色 我想通过颜色数组设置它以创建渐变 理想情况下 作为内部的可访问方法UINavigationBar将其颜色更改为此渐变 有什么建议么 除了手动设置图像作为导航栏的
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • 使用什么来移动 UIView self.frame 或 self.transform 属性?

    这个问题我有点困惑 我知道我可以改变观点self frame origin 但我发现有一个名为 变换 的属性 我认为这是用于在屏幕上移动我的视图等 也许我有点不明白 所以我想知道 我必须使用哪个房产来搬家UIView 或者它的子类 另一个类
  • 在后台运行 URL 请求

    我想在一定的时间间隔内发出 url 请求 例如 每 10 分钟应用程序应该发出一次 url 调用并获取一些 json 数据 应用程序在后台运行时应该能够执行此操作 这可以做到吗 如果是这样 这是否违反 Apple 服务条款 有什么限制吗 i
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • 如何在 iOS 应用程序中检测所有可用的 Wifi 网络并连接到其中之一

    在我的 iOS 应用程序中 我想检测所有可用的 wifi 网络 然后从列表中选择一个网络并连接到它 目标是不打开应用程序内置的设置来连接 Wi Fi 而是在我的应用程序中完成这一切 首先 这可能吗 如果可能的话 请指出要使用哪些框架和方法
  • 移动设备上的 TensorFlow(Android、iOS、Windows Phone)

    我目前正在寻找不同的深度学习框架 特别是用于训练和部署卷积神经网络 要求是 它可以在带有 GPU 的普通 PC 上进行训练 但训练后的模型必须部署在三个主要的移动操作系统上 即 Android iOS 和 Windows Phone Ten
  • 如何在 iOS 6 中强制 UIViewController 为纵向

    As the ShouldAutorotateToInterfaceOrientation在 iOS 6 中已弃用 我用它来强制特定视图仅肖像 在 iOS 6 中执行此操作的正确方法是什么 这仅适用于我的应用程序的一个区域 所有其他视图都可
  • UNTimeIntervalNotificationTrigger nextTriggerDate() 是否给出了错误的日期?

    我正在更新本地通知以与 iOS 10 配合使用 但遇到了一个问题 我认为 nextTrigger 函数返回的不是 满足触发条件的下一个日期 而是返回当前日期时间加上您最初设置 UNTimeInvervalNotificationTrigge
  • 游戏中心玩家显示名称在沙盒中始终为“我”

    我使用用户的游戏中心显示名称和玩家 ID 来维护他们在我的服务器上的个人资料 当我进行测试时 一切似乎都正确执行 但我的沙箱帐户的用户显示名称显示为 Me 而不是附加到我的帐户的显示名称 Billybobbo 这应该在沙盒模式下发生吗 Co
  • 如何删除以前的 ViewController

    我是一名学生 对编程还很陌生 我正在尝试在业余时间学习 Objective C Swift 我使用 spriteKit 和 swift 制作了一个游戏 有多个菜单 场景 我正在尝试从一个视图控制器转换到另一个视图控制器 为此 我使用了以下代
  • GCD 与自定义队列

    我想知道这两者的性能有什么区别 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY HIGH 0 perform complex operation dispat

随机推荐