swift参数及泛型参数参考!

author author     2023-04-28     338

关键词:

参考技术A 本节涉及泛型类型、泛型函数以及泛型构造器的参数,包括形参和实参。声明泛型类型、函数或构造器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型构造器时,就用具体的类型实参替代之。

关于 Swift 语言的泛型概述,见 泛型 (第二部分第22章)。

泛型形参语句指定泛型类型或函数的类型形参,以及这些参数的关联约束和要求。泛型形参语句用尖括号(<>)包住,并且有以下两种形式:

泛型形参列表中泛型形参用逗号分开,每一个采用以下形式:

泛型形参由两部分组成:类型形参及其后的可选约束。类型形参只是占位符类型(如T,U,V,KeyType,ValueType等)的名字而已。你可以在泛型类型、函数的其余部分或者构造器声明,以及函数或构造器的签名中使用它。

约束用于指明该类型形参继承自某个类或者遵守某个协议或协议的一部分。例如,在下面的泛型中,泛型形参T: Comparable表示任何用于替代类型形参T的类型实参必须满足Comparable协议。

如,Int和Double均满足Comparable协议,该函数接受任何一种类型。与泛型类型相反,调用泛型函数或构造器时不需要指定泛型实参语句。类型实参由传递给函数或构造器的实参推断而出。

要想对类型形参及其关联类型指定额外要求,可以在泛型形参列表之后添加where语句。where语句由关键字where及其后的用逗号分割的多个要求组成。

where语句中的要求用于指明该类型形参继承自某个类或遵守某个协议或协议的一部分。尽管where语句有助于表达类型形参上的简单约束(如T: Comparable等同于T where T: Comparable,等等),但是依然可以用来对类型形参及其关联约束提供更复杂的约束。如,<T where T: C, T: P>表示泛型类型T继承自类C且遵守协议P。

如上所述,可以强制约束类型形参的关联类型遵守某个协议。<T: Generator where T.Element: Equatable>表示T遵守Generator协议,而且T的关联类型T.Element遵守Eauatable协议(T有关联类型是因为Generator声明了Element,而T遵守Generator协议)。

也可以用操作符==来指定两个类型等效的要求。例如,有这样一个约束:T和U遵守Generator协议,同时要求它们的关联类型等同,可以这样来表达:<T: Generator, U: Generator where T.Element == U.Element>。

当然,替代类型形参的类型实参必须满足所有类型形参所要求的约束和要求。

泛型函数或构造器可以重载,但在泛型形参语句中的类型形参必须有不同的约束或要求,抑或二者皆不同。当调用重载的泛型函数或构造器时,编译器会用这些约束来决定调用哪个重载函数或构造器。

泛型类可以生成一个子类,但是这个子类也必须是泛型类。

泛型实参语句指定泛型类型的类型实参。泛型实参语句用尖括号(<>)包住,形式如下:

泛型实参列表中类型实参有逗号分开。类型实参是实际具体类型的名字,用来替代泛型类型的泛型形参语句中的相应的类型形参。从而得到泛型类型的一个特化版本。如,Swift标准库的泛型字典类型定义如下:

泛型Dictionary类型的特化版本,Dictionary<String, Int>就是用具体的String和Int类型替代泛型类型KeyType: Hashable和ValueType产生的。每一个类型实参必须满足它所替代的泛型形参的所有约束,包括任何where语句所指定的额外的要求。上面的例子中,类型形参KeyType要求满足Hashable协议,因此String也必须满足Hashable协议。

可以用本身就是泛型类型的特化版本的类型实参替代类型形参(假设已满足合适的约束和要求)。例如,为了生成一个元素类型是整型数组的数组,可以用数组的特化版本Array<Int>替代泛型类型Array<T>的类型形参T来实现。

如 泛型形参语句 所述,不能用泛型实参语句来指定泛型函数或构造器的类型实参。

委托应用及泛型委托和多播委托

一、委托一般作为方法的参数或者返回值,或者使用多播委托(注册多个方法,可以全部触发) 1.示例:根据对于字符串不同的处理方法逻辑privatedelegatevoidPrintString(stringstr);staticvoidPrintStr(PrintStringprint,stringstr){print(str);}staticvo... 查看详情

Swift 中的泛型 - “无法推断出泛型参数‘T’

】Swift中的泛型-“无法推断出泛型参数‘T’【英文标题】:GenericsinSwift-"Genericparameter\'T\'couldnotbeinferred【发布时间】:2016-08-1714:11:43【问题描述】:我想从一个方法返回一个符合MyProtocol的UIViewController,所以我使用方法签名... 查看详情

如何从 Swift 泛型函数中捕获参数

】如何从Swift泛型函数中捕获参数【英文标题】:HowtocaptureargumentsfromSwiftgenericfunction【发布时间】:2020-12-1723:51:34【问题描述】:我有一个Swift协议,它定义了一个用于发出网络请求的通用函数。它看起来像这样:protocolTaskManagerP... 查看详情

Swift - 在具有可选参数的泛型函数中以 Nil 作为参数

】Swift-在具有可选参数的泛型函数中以Nil作为参数【英文标题】:Swift-TakeNilasArgumentinGenericFunctionwithOptionalArgument【发布时间】:2016-07-0213:16:59【问题描述】:我正在尝试创建一个可以采用可选参数的通用函数。到目前为止,这是... 查看详情

Type 应该采用啥协议来让泛型函数将任何数字类型作为 Swift 中的参数?

...该采用啥协议来让泛型函数将任何数字类型作为Swift中的参数?【英文标题】:WhatprotocolshouldbeadoptedbyaTypeforagenericfunctiontotakeanynumbertypeasanargumentinSwift?Type应该采用什么协议来让泛型函数将任何数字类型作为Swift中的参数?【发布... 查看详情

Swift - JSONDecoder - 将类类型作为参数传递给使用泛型方法解码模型

】Swift-JSONDecoder-将类类型作为参数传递给使用泛型方法解码模型【英文标题】:Swift-JSONDecoder-passingclassTypeasparametertodecodemodelusinggenericmethod【发布时间】:2020-03-2715:43:15【问题描述】:在这里,我们遇到了使用“JSONDecoder”解析模... 查看详情

swift中泛型和any类型

...相似。Any类型和泛型两者都能用于定义接受两个不同类型参数的函数。然而,理解两者之间的区别至关重要:泛型可以用于定义灵活的函数,类型检查仍然由编译器负责;而Any类型则可以避开Swift的类型系统(所以应该尽可能避免... 查看详情

受其他泛型参数约束的泛型参数

】受其他泛型参数约束的泛型参数【英文标题】:Genericparameterconstrainedbyothergenericparameter【发布时间】:2015-05-2321:50:05【问题描述】:由于Swift缺乏协方差,我需要一些解决方法。我来自Java世界,所以我本能地尝试创建从一种类... 查看详情

对泛型的理解

...,泛型类,泛型方法,及泛型属性  //以类型作为参数的类就叫泛型  //作用:提高程序健壮性,简化代码以及方便扩展  //泛型的默认值是Object  //泛型的属性属性的数据类型由调用方来决定当前属性... 查看详情

在泛型类中传递泛型参数

】在泛型类中传递泛型参数【英文标题】:Passinggenericparametersinagenericclass【发布时间】:2019-05-2117:00:26【问题描述】:是否有可能在swift中使用泛型得到类似下面的东西?任何帮助都将比其他任何事情都更重要。classABCvartitle:Strin... 查看详情

快速上手kotlin接口抽象类及泛型(代码片段)

接口定义    kotlin规定所有的接口属性和函数实现都要使用override关键字,接口中定义的函数并不需要open关键字修饰,他们默认就是open的代码展示:packagecom.wustyq.kotlinstudyinterfaceMovablevarmaxSpeed:Intvarwheels:Intfunmove(movabl... 查看详情

为泛型 Swift 扩展一个类模型

...此值。我能够获取对象,但我扩展了基本响应以处理额外参数,但扩展值似乎不起作用。预期的数据可能是一个对象数组,也可能只是一个常规对象。传递此值后,它停止工作并且未获取数据,但除data之外的所有其他参数(如st... 查看详情

泛型类型“结果”专门具有太多类型参数(得到 2,但预期为 1)

】泛型类型“结果”专门具有太多类型参数(得到2,但预期为1)【英文标题】:Generictype\'Result\'specializedwithtoomanytypeparameters(got2,butexpected1)【发布时间】:2019-05-2622:36:10【问题描述】:我将如何解决这个错误,它只在我导入Almofi... 查看详情

java中的泛型类是啥东西?

...前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况... 查看详情

c#泛型参数的数据结构还原?

...f;定义了一个泛型方法publicboolTest<T>(stringa,Tb)//当传入参数是数据类型为a的变量时,我要引用其成员ai、as、af该如何操作?当调用时,如果参数Tb是某个类型为a的变量b,1.如何判断传入参数数据类型?2.如果传入数据类型为a... 查看详情

返回类型为协议的泛型函数与参数和返回类型为协议的非泛型函数的区别

】返回类型为协议的泛型函数与参数和返回类型为协议的非泛型函数的区别【英文标题】:Differencebetweengenericfunctionwhosereturntypeisprotocolandnongenericfunctionwhoseargumentandreturntypeareprotocol【发布时间】:2021-05-2402:15:04【问题描述】:在... 查看详情

c#日常c#泛型集合dictionary<tkey,tvalue>使用方法及泛型集合检查是否存在key值(代码片段)

推荐阅读CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客QQ群:1040082875大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。一、前言在工作中学习,在... 查看详情

kotlin泛型①(泛型类|泛型参数|泛型函数|多泛型参数|泛型类型约束)(代码片段)

文章目录一、泛型类二、泛型参数三、泛型函数四、多泛型参数五、泛型类型约束一、泛型类定义一个泛型类,将泛型参数T放在尖括号<T>中,该泛型参数放在类名后,主构造函数之前,该泛型参数T是类型占位符,在该泛型类类中... 查看详情