java 类作为参数_如何将类类型作为函数参数传递
您正在以错误的方式接近它:在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 类作为参数_如何将类类型作为函数参数传递相关推荐
- C#类与对象_创建玩家类
C#:类与对象_创建玩家类,实现字段,方法,引用和简单游戏逻辑 //创建CF当中的玩家类Player,该类含有字段:名字,性别, 血量,武器. //武器背包当中匕首,步枪,机枪,狙击枪. 玩家类具有以 ...
- java ajax翻页_分页 工具类 前后台代码 Java JavaScript (ajax) 实现 讲解
[博客园cnblogs笔者m-yb原创, 转载请加本文博客链接,笔者github: https://github.com/mayangbo666,公众号aandb7,QQ群927113708] htt ...
- java接口作为参数_JAVA:将类、抽象类、接口当成方法的参数传入
将类当成参数传入方法,其实就是将类的对象传入方法,如果是抽象类,其实就是将抽象类的子类的对象传入方法,如果是接口,其实就是将接口实现类的对象传入方法. 因为抽象类和接口是不能实例化成对象的,所以必须找 ...
- java常用的分隔符_*文件操作类1(基本操作)分隔符的使用
Java IO学习原则:抽象类中定义的抽象方法会根据实例化其子类的不同,也会完成不同的功能. 使用File类来进行文件的操作. 如果要进行所有的文件以及文件内容的开发操作,那么应该使用java.io包 ...
- python定义类带参数_类的定义、构造方法和参数传递
我们在前面学习的数据类型都是类,我们可以在类中使用很多方法. 1. 类的定义 类的定义使用的是class关键字,语法结构如下:class Name: '''类文档''' content Name为我们 ...
- python类的参数_在Python中使用类中的参数
当我在Codecademy上学习 Python时,我遇到了这个问题,代码如下: class Employee(object): def __init__(self, name): self.name ...
- java+hadoop配置参数_将Hadoop参数传递给Java代码
我有一个Uber jar执行一些级联ETL任务. jar的执行方式如下: hadoop jar munge-data.jar 我希望在作业启动时将参数传递给jar,例如 hadoop jar mung ...
- java 切面获取参数_每天分享一点Java知识(spring-aop)
每天分享一点Java知识,码字不易,喜欢的可以关注一波,共同学习.20191127 本篇将详细讲解SpringAOP的概念以及如何实现. 1. 何为AOP AOP:面向切面编程,相对于OOP面向对象编 ...
- java运行时参数_运行时的Java 8参数名称
java运行时参数 Java 8将引入一种更容易的方法来发现方法和构造函数的参数名称. 在Java 8之前,找到参数名称的方法是在编译阶段打开调试符号,这会在生成的类文件中添加有关参数名称的元信息,然 ...
最新文章
- svm对未知数据的分类_基于SVM的高维不平衡数据分类方法与流程
- Python 途虎养车全系车型轮毂--参数分析与实现
- mysql开创_MySQL创始人打造MariaDB 全面兼容MySQL 5.1
- Cookie和Session-学习笔记04【Session之验证码案例】
- python中复制、浅层拷贝、深层拷贝的区别
- 在SQL中使用DEFAULT约束
- Oracle Buffer Cache的keep、recycle、default pool概念图解
- STM32 - 定时器高级应用说明 - 多触波的实现 (N-pulse waveform generation using timer synchronization)- 01
- SQLite数据库浅谈
- QQ空间Python爬虫(3)---终章
- Power BI中的AI语义分析应用:《辛普森一家》
- 如何调用Android隐藏API
- python设计棋牌游戏
- 阿冰自己弄网站,利于开发的工具
- kubeadm+kube-vip搭建高可用k8s集群
- Android 第三方 ROM
- 用抽象类简单实现一个发工资系统
- Msg 15138 The database principal owns a schema in the database, and cannot be dropped.
- 妙用分部积分处理双重积分
- springboot影院售票小程序毕业设计源码111154