技术好文:Swit项目

简介: 技术好文:Swit项目

p.p1 { margin: 0; font: 24px "Yuanti SC" }


一、项目部署+配置


二、初始化项目


①常规初始化


class MainViewController: UITabBarController {


override func viewDidLoad() {


super.viewDidLoad()


//1.创建TabBar第一种方法


addChildViewController( "HomeViewController", "首页", "tabbar_home")


addChildViewController( "MessageViewController", "消息", "tabbar_message_center")


addChildViewController( "DiscoverViewController", "发现", "tabbar_discover")


addChildViewController( "ProfileViewController", "我", "tabbarprofile")


}


// swift支持方法的重载


// 方法的重载:方法名称相同,但是参数不同. --> 1.参数的类型不同 2.参数的个数不同


// private在当前文件中可以访问,但是其他文件不能访问


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


// 0.获取命名空间(Swift 类名格式: 主工程.类名 - WeiBo.HomeViewController)


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


print("没有获取命名空间")


return


}


// 1.根据字符串获取对应的Class


guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {


print("没有获取到字符串对应的Class")


return


}


// 2.将对应的AnyObject转成控制器的类型


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


print("没有获取对应控制器的类型")


return


}


// 3.创建对应的控制器对象


let childVc = childVcType.init()


// 4.设置子控制器的属性


childVc.title = title


childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName)


childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted")


// 5.包装导航栏控制器


let childNav = UINavigationController(rootViewController: childVc)


// 6.添加控制器


addChild(childNav)


}


}


②json文件动态初始化


class MainViewController: UITabBarController {


override func viewDidLoad() {


super.viewDidLoad()


//2.通过json文件创建VC,动态初始化TabBarController


// 1.获取json文件路径


guard let jsonPath = Bundle.main.path(forResource: "MainVCSettings.json", //代码效果参考:http://hnjlyzjd.com/xl/wz_25064.html

ofType: nil) else {

print("没有获取到对应的文件路径")


return


}


// 2.读取json文件中的内容


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


print("没有获取到json文件中数据")


return


}


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


return


}


guard let dictArray = anyObject as? 【【String : AnyObject】】 else {


return


}


// 4.遍历字典,获取对应的信息


for dict in dictArray {


// 4.1.获取控制器的对应的字符串


guard let vcName = dict【"vcName"】 as? String //代码效果参考:http://hnjlyzjd.com/hw/wz_25062.html

else {

continue


}


// 4.2.获取控制器显示的title


guard let title = dict【"title"】 as? String else {


continue


}


// 4.3.获取控制器显示的图标名称


guard let imageName = dict【"imageName"】 as? String else {


continue


}


// 4.4.添加子控制器


addChildViewController(vcName, title, imageName)


}


}


// swift支持方法的重载


// 方法的重载:方法名称相同,但是参数不同. --> 1.参数的类型不同 2.参数的个数不同


// private在当前文件中可以访问,但是其他文件不能访问


private func addChildViewController( childVcName: String, title : String, _ imageName : String) {


// 0.获取命名空间(Swift 类名格式: 主工程.类名 - WeiBo.HomeViewController)


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


print("没有获取命名空间")


return


}


// 1.根据字符串获取对应的Class


guard let ChildVcClass = NSClassFromString(nameSpace + "." + childVcName) else {


print("没有获取到字符串对应的Class")


return


}


// 2.将对应的AnyObject转成控制器的类型


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


print("没有获取对应控制器的类型")


return


}


// 3.创建对应的控制器对象


let childVc = childVcType.init()


// 4.设置子控制器的属性


childVc.title = title


childVc.tabBarItem.image = UIImage.noRenderingImageName(imageName: imageName)


childVc.tabBarItem.selectedImage = UIImage.noRenderingImageName(imageName: imageName + "_highlighted")


// 5.包装导航栏控制器


let childNav = UINavigationController(rootViewController: childVc)


// 6.添加控制器


addChild(childNav)


}


}


三、异常处理方式


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


将Data转成数组


如果在调用系统某一个方法时,该方法最后有一个throws.说明该方法会抛出异常.如果一个方法会抛出异常,那么需要对该异常进行处理


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


在swift中提供三种处理异常的方式


方式一:try方式 程序员手动捕捉异常


do {


try NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)


} catch {


// error异常的对象


print(error)


}


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


方式二:try?方式(常用方式) 系统帮助我们处理异常,如果该方法出现了异常,则该方法返回nil.如果没有异常,则返回对应的对象


guard let anyObject = try? NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers) else {


return


}


p.p1 { margin: 0; font: 14px "Yuanti SC"; color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1) }


方式三:try!方法(不建议,非常危险) 直接告诉系统,该方法没有异常.注意:如果该方法出现了异常,那么程序会报错(崩溃)


let anyObject = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

相关文章
|
存储 SQL 安全
MySQL 安全加固配置(等保二级)
数据库安全是等保测评和网络安全中的重要的一项内容,本文介绍一些常见的加固配置。
4823 0
|
2月前
|
机器人 图形学 开发者
腾讯混元最新开源:一张图,秒变游戏大片
有没有想过,随手拍的一张风景照,下一秒就能变成可操控的游戏开放世界?
217 3
|
20天前
|
运维 Linux 数据库
基于 Docker 部署 n8n 指南,新手一看就会
本教程详解如何通过 Docker 快速部署开源自动化工具 n8n,适合新手快速上手。内容涵盖官方部署步骤、常见难点及第三方一键部署方案,助你高效搭建自动化工作流平台。
337 6
|
28天前
|
存储 SQL 运维
速看!数据库与数据仓库的本质区别是什么?
本文深入解析了“数据库”与“数据仓库”的核心区别,涵盖设计目的、数据结构、使用场景、性能优化和数据更新五个维度。数据库主要用于支持实时业务操作,强调事务处理效率;数据仓库则面向企业分析决策,注重海量数据的整合与查询性能。二者在企业中各司其职,缺一不可。
|
11月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
519 3
|
6月前
|
NoSQL Redis 数据库
Docker平台上的Redis镜像运行
这就是如何在Docker平台上运行Redis镜像的全部过程。走进Docker和Redis的世界,探索更多可能!
394 10
|
存储 算法 Java
惊!Java程序员必看:JVM调优揭秘,堆溢出、栈溢出如何巧妙化解?
【8月更文挑战第29天】在Java领域,JVM是代码运行的基础,但需适当调优以发挥最佳性能。本文探讨了JVM中常见的堆溢出和栈溢出问题及其解决方法。堆溢出发生在堆空间不足时,可通过增加堆空间、优化代码及释放对象解决;栈溢出则因递归调用过深或线程过多引起,调整栈大小、优化算法和使用线程池可有效应对。通过合理配置和调优JVM,可确保Java应用稳定高效运行。
360 4
|
9月前
|
存储 数据可视化 知识图谱
高效知识管理的五大方法,助力写作更上一层楼
在信息爆炸的时代,高效的知识管理是提升写作效率与质量的关键。本文探讨如何通过系统化的知识获取、分类存储、动态更新和高效检索,构建个人知识体系,并介绍智能化工具如看板的应用,帮助写作者整合信息、激发灵感、优化流程,实现从输入到输出的闭环,持续提升创作能力。
218 14
高效知识管理的五大方法,助力写作更上一层楼
|
8月前
|
人工智能 NoSQL Java
SpringAI做对了什么
SpringAI 在 AI 编程领域延续了Spring的诸多优势,从易于集成、到通用API设计进行模型切换等。
426 2
SpringAI做对了什么
|
人工智能 开发框架 自然语言处理
移动应用开发的未来趋势:跨平台框架与AI的融合
随着移动设备成为日常生活中不可或缺的一部分,移动应用开发领域正在经历前所未有的变革。跨平台框架的出现使得开发者能够以更高的效率和更低的成本创建在多个操作系统上运行的应用,而人工智能(AI)技术的集成则为移动应用带来了更加智能化和个性化的用户体验。本文将探讨这些技术进步如何塑造移动应用的未来,包括Flutter等跨平台框架的优势、AI在移动应用中的实际应用案例,以及这些技术对移动应用开发行业的影响。
214 0