Swift通过类名动态创建对象的方式
2015-10-16 16:00
405 查看
原文出处:Swift通过类名动态创建对象的方式
前言
最近一些朋友问到我在Swift中如何通过类字符串名称的方式创建类实例的问题,起初以为与Objective-C的差不多吧,事实上还是有很大的差别的。下面是帮助朋友们之后,也随便总结而写下的文章。
注意:本篇文章中所涉及到的Swift代码都是Swift2.0的语法。
先看ObjC中的方式
我们可以通过Class类型就可以调用alloc来分配内存,调用init方法来初始化。如:Class cl = NSClassFromString(@"ViewController"); UIViewController *vc = [[cl alloc] init];
通常我们这么写法是用于循环创建的场景,通过公共基类接收,就可以指向所创建的对应的类名称的内存。
Swift中的方式
今天是由于一位朋友突然询问我这么一个问题:swift中怎么通过类名称创建对象呢?
一时并无法回答,因为一看到
Swift中NSClassFromString返回的是
AnyClass类型,而这个
AnyClass类型为
public typealias AnyClass = AnyObject.Type,这个
Type具体是什么呢?为什么
option+点击进不去,无法查看呢?
AnyObject其实只是一个空协议,难道.Type是自动有的吗?这个本人也不清楚。
看看下面的方式:
var str = NSString.self()// 或者NSString.self.init() str = "TestNSString" print(str)
下面我们定义一个类:
class MyClass: NSObject { var member = 10 override required init() { print("init") } }
我们定义的类是继承于NSObject,这时我们这么测试:
// 打印出10 print( MyClass.self().member)
说明继承于NSObject后, 调用self()就可以创建对象了。
另外,我们使用NSClassFromString来创建试试:
let className = NSStringFromClass(MyClass) print(className) let classType = NSClassFromString(className) as? MyClass.Type if let type = classType { let my = type.init() print(my.member) }
第一个打印就打印出
__lldb_expr_83.MyClass。
第二个打印打印出
10。type为MyClass.Type,通过MyClass.Type.init()是可以创建类对象的。
我们还可以通过MyClass.self.init()来创建对象,
print(MyClass.self.init().member)打印出来也是10
注意:所创建的
MyClass类中的
init方法前面必须是
required的,因为这么创建方式是使用meta type来创建的,如果不添加
required,编译时就会报错。当我们修改继承方式,把
NSObject改成
AnyObject,其结果也一样,
AnyObject只是协议,遵守协议。说明与继承方式无关。
总结:
在Swift中,要创建对象有以下几种方式:1、
NSString.self()// 或者NSString.self.init()
2、
let myClass = MyClass.Type.init()
3、
let myClass = MyClass.self.init()
4、
let type = NSClassFromString("MyClass") as! MyClass.Type然后通过
type.init()来创建对象
参考:[http://stackoverflow.com/questions/24049673/swift-class-introspection-generics
](http://stackoverflow.com/questions/24049673/swift-class-introspection-generics
)
此处省略10000字…请移步微信公众号阅读全文
公众号搜索「iOS开发技术分享」快速关注微信号:iOSDevShares
QQ群:324400294相关文章推荐
- Apple Swift学习教程
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- Swift中定义二维数组的方法及遍历方法示例
- 简单分析Swift语言的一些基本特征
- Swift与C语言指针结合使用实例
- Swift心得笔记之控制流
- IE不支持getElementsByClassName最终完美解决方案
- 用Swift构建一个简单的iOS邮件应用的方法
- 苹果公司推出的新编程语言Swift简介和入门教程
- Swift中的指针操作和使用详细介绍
- Swift中使用正则表达式的一些方法
- Swift心得笔记之运算符
- Swift中使用可选类型完美解决占位问题
- Swift学习笔记之构造器重载
- Swift中的Access Control权限控制介绍
- Swift类型创建之自定义一个类型详解
- Swift教程之控制流详解
- Swift中初始化方法的顺序介绍
- Swift里的值类型与引用类型区别和使用