您正在以错误的方式接近它:在Swift中,与Objective-C不同,类具有特定类型,甚至具有继承层次结构(即,如果类 B 继承自 A ,则 B.Type 也继承自 A.Type ):

class A {}

class B: A {}

class C {}

// B inherits from A

let object: A = B()

// B.Type also inherits from A.Type

let type: A.Type = B.self

// Error: 'C' is not a subtype of 'A'

let type2: A.Type = C.self

's why you shouldn' t使用 AnyClass ,除非你真的想允许任何类 . 在这种情况下,正确的类型将是 T.Type ,因为它表示 returningClass 参数和闭包参数之间的链接 .

实际上,使用它而不是 AnyClass 允许编译器正确地推断方法调用中的类型:

class func invokeService(service: String, withParams params: Dictionary, returningClass: T.Type, completionHandler handler: ((T) -> ())) {

// The compiler correctly infers that T is the class of the instances of returningClass

handler(returningClass())

}

现在有一个构建 T 实例传递给 handler 的问题:如果你现在尝试运行代码,编译器会抱怨 T 不能用 () 构造 . 理所当然地: T 必须明确约束,要求它实现特定的初始化程序 .

这可以通过以下协议来完成:

protocol Initable {

init()

}

class CityInfo : NSObject, Initable {

var cityName: String?

var regionCode: String?

var regionName: String?

// Nothing to change here, CityInfo already implements init()

}

然后,您只需将 invokeService 的通用约束从 更改为 .

提示

如果您遇到奇怪的错误,例如“无法将表达式的类型'()'转换为'String'”类型,则将方法调用的每个参数移动到其自己的变量通常很有用 . 它有助于缩小导致错误的代码并发现类型推断问题:

let service = "test"

let params = ["test" : "test"]

let returningClass = CityInfo.self

CastDAO.invokeService(service, withParams: params, returningClass: returningClass) { cityInfo in /*...*/

}

现在有两种可能性:错误移动到其中一个变量(这意味着错误的部分存在)或者你得到一个神秘的消息,如“无法将表达式的类型 () 转换为类型 ($T6) -> ($T6) -> $T5 ” .

后一个错误的原因是编译器无法推断您编写的类型 . 在这种情况下,问题是 T 仅用于闭包的参数,并且您传递的闭包不知道要推断的类型 . 通过将 returningClass 的类型更改为包含 T ,您可以为编译器提供确定泛型参数的方法 .

java 类作为参数_如何将类类型作为函数参数传递相关推荐

  1. C#类与对象_创建玩家类

    C#:类与对象_创建玩家类,实现字段,方法,引用和简单游戏逻辑 //创建CF当中的玩家类Player,该类含有字段:名字,性别, 血量,武器. //武器背包当中匕首,步枪,机枪,狙击枪. 玩家类具有以 ...

  2. java ajax翻页_分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解

    [博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...

  3. java接口作为参数_JAVA:将类、抽象类、接口当成方法的参数传入

    将类当成参数传入方法,其实就是将类的对象传入方法,如果是抽象类,其实就是将抽象类的子类的对象传入方法,如果是接口,其实就是将接口实现类的对象传入方法. 因为抽象类和接口是不能实例化成对象的,所以必须找 ...

  4. java常用的分隔符_*文件操作类1(基本操作)分隔符的使用

    Java IO学习原则:抽象类中定义的抽象方法会根据实例化其子类的不同,也会完成不同的功能. 使用File类来进行文件的操作. 如果要进行所有的文件以及文件内容的开发操作,那么应该使用java.io包 ...

  5. python定义类带参数_类的定义、构造方法和参数传递

    我们在前面学习的数据类型都是类,我们可以在类中使用很多方法. 1. 类的定义 类的定义使用的是class关键字,语法结构如下:class Name: '''类文档''' content Name为我们 ...

  6. python类的参数_在Python中使用类中的参数

    当我在Codecademy上学习 Python时,我遇到了这个问题,代码如下: class Employee(object): def __init__(self, name): self.name ...

  7. java+hadoop配置参数_将Hadoop参数传递给Java代码

    我有一个Uber jar执行一些级联ETL任务. jar的执行方式如下: hadoop jar munge-data.jar 我希望在作业启动时将参数传递给jar,例如 hadoop jar mung ...

  8. java 切面获取参数_每天分享一点Java知识(spring-aop)

    每天分享一点Java知识,码字不易,喜欢的可以关注一波,共同学习.20191127 本篇将详细讲解SpringAOP的概念以及如何实现. 1. 何为AOP AOP:面向切面编程,相对于OOP面向对象编 ...

  9. java运行时参数_运行时的Java 8参数名称

    java运行时参数 Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称. 在Java 8之前,找到参数名称的方法是在编译阶段打开调试符号,这会在生成的类文件中添加有关参数名称的元信息,然 ...

最新文章

  1. svm对未知数据的分类_基于SVM的高维不平衡数据分类方法与流程
  2. Python 途虎养车全系车型轮毂--参数分析与实现
  3. mysql开创_MySQL创始人打造MariaDB 全面兼容MySQL 5.1
  4. Cookie和Session-学习笔记04【Session之验证码案例】
  5. python中复制、浅层拷贝、深层拷贝的区别
  6. 在SQL中使用DEFAULT约束
  7. Oracle Buffer Cache的keep、recycle、default pool概念图解
  8. STM32 - 定时器高级应用说明 - 多触波的实现 (N-pulse waveform generation using timer synchronization)- 01
  9. SQLite数据库浅谈
  10. QQ空间Python爬虫(3)---终章
  11. Power BI中的AI语义分析应用:《辛普森一家》
  12. 如何调用Android隐藏API
  13. python设计棋牌游戏
  14. 阿冰自己弄网站,利于开发的工具
  15. kubeadm+kube-vip搭建高可用k8s集群
  16. Android 第三方 ROM
  17. 用抽象类简单实现一个发工资系统
  18. Msg 15138 The database principal owns a schema in the database, and cannot be dropped.
  19. 妙用分部积分处理双重积分
  20. springboot影院售票小程序毕业设计源码111154

热门文章

  1. oracle数据库建立外键级联删除
  2. 扫一扫功能在手机便签的哪里
  3. 微信小程序管理客服微信号
  4. 速卖通关键词挖掘工具_6款外贸高手都在用的关键词挖掘工具
  5. OpenStack 基础知识
  6. 颈椎牵引器的介绍-颈托护颈
  7. 这届年轻人有多爱养生?
  8. python 往mysql数据库存储照片
  9. NBIOT 设备接入ONENET平台
  10. 爬虫期末考试笔记(选择题)