android+根据类名创建对象,Swift 基础(3) -- 根据类名创建对象

1. 基础

Swift中的类名

在Swift中的类名是 : 命名空间 + 类名 .(比如:TestDemo.Person)

获取命名空间

// 1. 获取去命名空间,由于项目肯定有info.plist文件所有可以机型强制解包.

guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {

WSJLog(messsage: "没有获取到命名空间")

return

}

根据名称创建类对象

// 1. 根据类名获取对应的类

WSJLog(messsage: "\(nameSpace).\(childVcName)")

guard let childVcClass = NSClassFromString("\(nameSpace).\(childVcName)") else {

WSJLog(messsage: "没有获取到对应的类")

return

}

// 2. 将AnyObject转换成控制器类型

guard let childVcType = childVcClass as? UIViewController.Type else {

WSJLog(messsage: "没有转换成控制器类型")

return

}

// 3. 创建控制器实例

let childVc = childVcType.init()

2. 示例代码

实现从JSON文件中读取类名等信息,然后创建响应的控制器对象.

2.0. Json文件

[

{

"vcName": "HomeViewController",

"title": "首页",

"imageName": "tabbar_home"

},

{

"vcName": "MessageViewController",

"title": "消息",

"imageName": "tabbar_message_center"

},

{

"vcName": "DiscoverViewController",

"title": "发现",

"imageName": "tabbar_discover"

},

{

"vcName": "ProfileViewController",

"title": "我",

"imageName": "tabbar_profile"

}

]

2.1 读取JSON文件并将其转成字典,读出数据

// 1. 读取Json文件路径

guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", ofType: nil) else {

WSJLog(messsage: "没有获取到JSON文件路径")

return

}

// 2. 读取JSON中的内容

guard let jsonData = NSData.init(contentsOfFile: jsonPath) else {

WSJLog(messsage: "没有读取到JSON文件")

return

}

// 3. 转换成JSON

guard let anyOject = try? JSONSerialization.jsonObject(with: jsonData as Data, options: .mutableContainers) else {

WSJLog(messsage: "生成JSON失败")

return

}

guard let dictArray = anyOject as? [[String:AnyObject]] else {

WSJLog(messsage: "字典穿件失败")

return

}

// 4. 遍历字典创建对应的控制器

for dict in dictArray {

// 4.1 取类名

guard let vcName = dict["vcName"] as? String else {

WSJLog(messsage: "类名事变")

continue

}

// 4.2 取标题

guard let title = dict["title"] as? String else {

WSJLog(messsage: "标题失败")

continue

}

// 4.3 取类名

guard let imageName = dict["imageName"] as? String else {

WSJLog(messsage: "图片事变")

continue

}

// 4.4 添加子控制器

addChildViewController(childVcName: vcName, title: title, iconName: imageName)

}

2.2 添加控制器,创建控制器.

/**

根据控制器类名创建对应的控制器, 在Swift中控制器类名 : 命名空间.类名

*/

private func addChildViewController(childVcName: String ,title:String ,iconName:String){

// 1. 获取去命名空间,由于项目肯定有info.plist文件所有可以机型强制解包.

guard let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {

WSJLog(messsage: "没有获取到命名空间")

return

}

// 2. 根据类名获取对应的类

WSJLog(messsage: "\(nameSpace).\(childVcName)")

guard let childVcClass = NSClassFromString("\(nameSpace).\(childVcName)") else {

WSJLog(messsage: "没有获取到对应的类")

return

}

// 3. 将AnyObject转换成控制器类型

guard let childVcType = childVcClass as? UIViewController.Type else {

WSJLog(messsage: "没有转换成控制器类型")

return

}

// 4. 创建控制器实例

let childVc = childVcType.init()

// 5. 添加控制器

addChildViewController(childvc: childVc, title: title, iconName: iconName)

}

/**

Swift 中允许函数重载

1. 函数名称相同.

2. 函数参数类型不同.

3. 函数参数个数不同.

*/

// private : 只有在本文中可以访问.

private func addChildViewController(childvc: UIViewController ,title:String ,iconName:String) {

WSJLog(messsage: "添加控制器")

// 1. 设置子控制器属性

childvc.title = title

childvc.tabBarItem.image = UIImage(named: iconName)

childvc.tabBarItem.selectedImage = UIImage(named: "\(iconName)_highlighted")

// 2. 包装导航控制器

let childNav = UINavigationController(rootViewController: childvc)

// 3. 添加控制器

addChildViewController(childNav)

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值