泛型类型约束与继承

2023-12-10

这两个函数声明有区别吗?

func doSomething<T: UIViewController>(controller: T) {...}

vs.

func doSomething(controller: UIViewController) {...}

In 类型约束语法的部分苹果的 Swift 编程语言书上有这个代码示例:

func​ ​someFunction​<​T​: ​SomeClass​, ​U​: ​SomeProtocol​>(​someT​: ​T​, ​someU​: ​U​) {
    // function body goes here
}

与此描述:

上面的假设函数有两个类型参数。第一个类型参数 T 具有类型约束,要求 T 是 SomeClass 的子类。 ...

那么什么情况下使用上面描述的泛型函数更好呢?


它们是不同的,但就您使用它们的方式而言,它们几乎达到完全相同的结果。

不同之处在于,当您调用通用版本时,编译器设置T静态地为作为参数传入的任何类型。当调用该参数的方法时,这几乎没有什么区别 - 无论哪种方式,对其方法的调用都将动态分派,并且您无法触及该参数的任何部分T不能保证从约束中可用。

但是假设您对此方法进行了更改,不仅要接受参数,而且还要接受参数return一、同类型:

// T here will take the type of whatever is going in/out of the function
// be that UIViewController or a subtype of it
func doSomethingGenerically<T: UIViewController>(controller: T) -> T {  
    // some logic that results in a new controller being returned
}

// here the return type is fixed to be UIViewController
func doSomethingViaBaseClass(controller: UIViewController) -> UIViewController {  
    // some logic that results in a new controller being returned
}

现在,假设你有一个子类UIViewController你正在传递,就像这样:

let subClass: MyUIViewController = ...

let controller1 = doSomethingGenerically(subClass)

let controller2 = doSomethingViaBaseClass(subClass)

这里,变量的类型controller1MyUIViewController,因为这是传递给函数的内容,所以这就是T是。但变量的类型controller2UIViewController因为这是固定类型doSomethingViaBaseClass返回。

请注意,这并不意味着它们的对象参考会有所不同 - 这取决于函数体实现的内容。这只是变量的类型指称它将改变。

还有其他细微的差异,但这是需要了解的主要差异。然而,就结构而言,还有更多值得注意的差异。碰巧我写了一篇文章昨天关于他们的事情可能会有所帮助。

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

泛型类型约束与继承 的相关文章

随机推荐

  • 当开发名称以数字开头时,Android studio中的包名称?

    我想以我公司的名义创建应用程序 Android Studio 建议使用您的域名 例如 域名 example com 应用程序 我的应用程序 给出 com example myApp 的包名称 没关系 但我的公司名称以数字开头 Android
  • 如何在 Spotfire 中显示前 10 个列值

    我需要使用 Spotfire 显示前 10 个值 我用谷歌搜索了很多 但找不到最好的解决方案 我按照这个教程进行操作 创建动态前十图表但没有找到成功 我怎样才能做到这一点 如何通过前 10 个值限制可视化 有两种方法可以做到这一点 我将列出
  • django-postman扩展了一个不存在的base.html

    我已经安装并配置了django postman基于文档 in urls py在我的项目的根目录中 r messages include postman urls 在设置 py中 INSTALLED APPS django contrib a
  • php - move_uploaded_file - 为什么它很重要?

    我无法想象为什么我应该使用这个函数而不是简单的重命名 手册写道 移动上传文件 该函数检查以确保 filename 指定的文件 是一个有效的上传文件 意味着它是通过 PHP 的 HTTP 上传的 POST 上传机制 如果文件有效 它将被移动到
  • sscanf 函数更改另一个字符串的内容

    我在读取字符串时遇到问题sscanf 我简化了代码以专注于问题 下面是整个代码中的一个函数 它应该打开一个文件并读取一些内容 但sscanf表现得很奇怪 例如我声明一个名为atm与内容 ATOM 之前sscanf它将这个字符串打印为ATOM
  • 如何通过java代码连接sql server?

    我正在创建需要将我的服务连接到 sql server 的应用程序 当我添加依赖后运行测试代码时 它运行成功 这是成功运行的测试代码 import java sql Connection import java sql DatabaseMet
  • MS Access 根据表单值传递

    如何将传递查询分配给依赖于表单中另一个值的行源 本质上我想这样做 SELECT x companyid x companyname x productid FROM x WHERE x CompanyID Forms Reporting C
  • 将 Doctrine 与 Zend Framework 1.8 应用程序集成

    我有兴趣使用 Doctrine 作为我正在编写的新 Zend Framework 应用程序的 ORM 我正在尝试找出尽可能简单地集成它的最佳方法 我发现的每个例子都是不同的 其中很多都早于 ZF 1 8 中新的自动加载功能 他们还没有为我工
  • 在threading.thread中,为什么args在末尾带有逗号[重复]

    这个问题在这里已经有答案了 我正在阅读Python中的多线程 当我进入如下代码时 x threading Thread target thread function args 1 我有点困惑为什么args is 1 最后需要一个逗号 我已经
  • unicode 模式下的 preg_split:delim_capture 不起作用?

    我正在尝试使用正则表达式将一大块中文文本分割成句子 就我的目的而言 句子分隔符是 全角句号 0x3002 全角问号 0xFF1F 全角感叹号 0xFF01 现在 假设我的 str 是这样的 str 你好 你好吗 我是程序员 不太懂这个我问题
  • Reporting Services 2008 - 长子报表导致分页

    类似这个问题 但我有一个 主 报告 其中包含许多子报告 一切都运行良好 直到其中一个子报表在渲染时 例如 PDF 将占据页面上剩余的空间 在这种情况下 分页会导致子报表在新页面上开始 有时 当一个报表仅占用一页上的一点空间 然后由于以下子报
  • 在R中创建二元指示矩阵(布尔矩阵)

    我有一个表明参加会议的数据列表 如下所示 Event Participant ConferenceA John ConferenceA Joe ConferenceA Mary ConferenceB John ConferenceB Te
  • Symfony2:学说:PHPUnit:在单元测试中使用模拟实体管理器刷新期间设置实体 ID

    Symfony 2 8 13 Doctrine ORM 2 5 5 PHPUnit 5 7 5 我想测试一个使用学说实体管理器的类的方法 此公共方法调用一个私有方法来实例化 Bookmark 实体 刷新它并返回该实体 然后 在测试的方法中我
  • 不使用 for-each 旋转 背景颜色

    我正在尝试设置其他每个的背景颜色 tr 我没有使用 for each 循环 因为我使用一些模板来根据节点值过滤数据 tr
  • ASP.NET C# 使用 System.IO 复制目录和子目录

    我需要将整个目录 C X 复制到 C Y X 并且还需要复制子文件夹 有什么方法可以使用 System IO File Directory 命名空间来做到这一点吗 感谢所有帮助者 此类将复制或移动文件夹 无需递归调用 这些方法使用自己的堆栈
  • UTF-8 字符串分隔符

    我正在解析一个二进制协议 其中 UTF 8 字符串散布在原始字节中 此特定协议在每个 UTF 8 字符串前面添加一个短字符 两个字节 指示后续 UTF 8 字符串的长度 这给出了最大字符串长度 2 16 gt 65 000 这对于特定应用来
  • 如何触发特定的Google自定义搜索引擎细化标签?

    目前 我们的组织正在使用 Google 自定义搜索引擎来提供自动建议 并且我们在 CSE 中配置了大约 3 个优化标签 之前 我们使用 WebSearch 和 SearchControl WebSearch 有一个 setSiteRestr
  • QWizard:更改标题字段的高度/尺寸

    我目前正在尝试为我正在开发的 Python Qt 应用程序实现一个简单的 第一步 向导 使用 Designer 确实很容易做到这一点 但与往常一样 问题在于细节 我的问题是 标题 字段对我来说太大了 约占可用屏幕空间的 50 这里有一个截屏
  • 给定表数据的期望输出

    您好 我有一个表测试其结构如下 Testing PK C1 c2 1 v11 v12 2 v21 v23 3 v31 v32 现在我需要查询该表 测试 以便获得以下输出 Pk Key value 1 c1 v11 1 c1 v12 2 c2
  • 泛型类型约束与继承

    这两个函数声明有区别吗 func doSomething