ios原生开发初体验
ios原生开发初体验
🍎前言
机缘巧合之下参加了“移动应用创新赛”,借此机会被迫主动接触ios应用的开发相关方面的知识与技术,也因此有了这篇文章,来记录下我的感受。从开始学习到这篇文章开始撰写,约一周时间,估摸着每天断断续续敲三四个小时左右,自认为收获颇丰。
MacOS操作系统
本打算直接谈Swift的,但不得不先提一嘴Mac,想要搞apple相关应用的开发就离不开要有台Mac(虚拟机除外)。我觉得这一步就难倒许多大学生了,显然目前国内的绝大多数大学生的操作系统是Windows。本人平时也是用习惯了Windows,一时间上手Mac真是哪哪都别扭,在这就折腾了好一会。
Swift语言
我一上来就直接跟着apple官网的开发者教程走的,基础语法就嫖了眼菜鸟教程的目录,就按照官网教程直接开始敲代码了
语法糖
讲讲我喜欢的几个语法糖(不全),就一些语法看和python很像
换行:直接用换行来分割代码行,省去了敲
;
的步骤,必须点赞。我认为分号的意义在软件开发中就是为了恶心人,一行代码写完直接回车既能分割代码有能保持可读性,何乐而不为呢,没必要多此一举以;
结尾。类型推断:这让定义变量时又可以少敲一点代码,像是Int、String、double、bool这些常用到的基础数据类型可以直接通过赋初值来由编译器自动判断
1
2let message = "Hello, World!" // 推断为 String 类型
var count = 10 // 推断为 Int 类型简化 for-in 循环:简化了遍历数组和字典的语法。
1
2
3
4
5
6
7
8
9let fruits = ["apple", "banana", "cherry"]
for fruit in fruits {
print(fruit)
}
let scores = ["Alice": 90, "Bob": 85]
for (name, score) in scores {
print("\(name): \(score)")
}
语法特色
- 可选类型:Swift 使用可选类型来处理可能为 nil 的值,避免了传统语言中的空指针异常。
- 闭包(Closure)
闭包(Closure)
这对我来说也是一个新语法,还不知道能在哪里用到。
一种能够捕获并存储其所在上下文中变量和常量的引用的函数。闭包不仅包含代码,还包含执行时所需的环境。闭包可以在其定义的作用域外被调用,并且能够访问和修改其捕获的变量。
我发现它有个神奇的特性捕获环境:闭包可以捕获并保存其上下文中的变量,即使这些变量在闭包定义的作用域外已不存在。
我就查了下捕获环境的实现机制:
捕获列表:闭包内创建变量的引用。
堆存储:被捕获的变量在堆上存储,确保它们在闭包存活期间不会被释放。
自动引用计数(ARC):管理捕获变量的引用计数,确保变量在闭包使用期间不会被释放。
- 捕获列表
当闭包捕获一个变量时,它实际上是在闭包内创建了该变量的一个引用。这个引用可以指向局部变量,也可以指向堆上的对象。捕获列表是闭包用来跟踪这些变量的结构。
1 | var total = 0 |
在这个例子中,闭包捕获了 total
和 incrementAmount
。这些变量被捕获为引用,闭包内可以通过这些引用访问和修改它们。
- 堆存储
当闭包捕获一个变量时,如果这个变量在闭包执行结束后仍需存在,那么这个变量会被存储在堆上,而不是栈上。这样可以确保即使闭包执行结束后,这些变量仍然存在。
1 | func makeIncrementer(incrementAmount: Int) -> () -> Int { |
在这个函数中,当 makeIncrementer
返回时,total
和 incrementAmount
被捕获到堆上,因此 incrementer
闭包可以在函数返回后继续访问这些变量。
- 自动引用计数(ARC)
Swift 使用自动引用计数(ARC)来管理内存。当闭包捕获一个变量时,ARC 会增加这个变量的引用计数,确保变量在闭包存活期间不会被释放。当闭包不再使用时,ARC 会减少引用计数,并在没有其他引用时释放变量。
1 | let incrementByTwo = makeIncrementer(incrementAmount: 2) |
在这个例子中,incrementByTwo
持有 incrementer
闭包的引用,因此捕获的变量 total
和 incrementAmount
也不会被释放。当 incrementByTwo
被调用时,闭包中的代码可以继续访问和修改 total
和 incrementAmount
。
Xcode
Xcode是Apple 官方开发应用程序工具和Android Studio类似,个人喜欢的点就coding的时候UI效果可以实时预览,便于页面的调整。而与我以往的Android开发感觉明显不同,我思考了一下觉得应该是采取的设计模式不同,一查也确实大致如此(MVC和MVVM的区别)
在查询资料的过程中也发现我的不足🤷♂️,其实现代Android开发也是推荐使用MVVM模式,同时也是可以通过Jetpack Compose 的预览功能类似于 SwiftUI,允许开发者在代码编写过程中实时查看 UI 变化。
下面就来看看MVVM和MVC究竟是什么吧👇
MVC 和 MVVM
MVC(Model-View-Controller)和 MVVM(Model-View-ViewModel)是两种常见的软件架构模式,它们主要用于分离代码中的关注点,从而使代码更加模块化、可维护和可测试。虽然它们都有类似的目的,但在具体实现和关注点上有明显的区别。
MVC(Model-View-Controller)
1. Model(模型):
- 表示应用的数据结构和业务逻辑。
- 与数据库和其他数据源交互。
2. View(视图):
- 负责显示数据和用户界面。
- 通过 Controller 获取数据,并根据这些数据更新视图。
3. Controller(控制器):
- 处理用户输入和应用逻辑。
- 作为 Model 和 View 之间的桥梁,接收用户输入并更新 Model,然后通知 View 更新显示。
MVVM(Model-View-ViewModel)
1. Model(模型):
- 表示应用的数据结构和业务逻辑。
- 与数据库和其他数据源交互。
2. View(视图):
- 负责显示数据和用户界面。
- 通过绑定(Binding)直接获取 ViewModel 提供的数据,并根据这些数据更新视图。
3. ViewModel(视图模型):
- 负责处理业务逻辑和准备数据供 View 显示。
- 不直接引用 View,而是通过绑定将数据和命令暴露给 View。
MVC 与 MVVM 的主要区别
1. 关注点的分离:
- 在 MVC 中,Controller 通常会变得非常复杂,因为它需要处理很多视图和业务逻辑。
- 在 MVVM 中,ViewModel 处理业务逻辑和数据准备,视图只负责展示,通过绑定机制从 ViewModel 获取数据。这使得视图更加轻量和专注。
2. 数据绑定:
- MVC 没有内置的数据绑定机制。Controller 必须显式地将数据推送到 View。
- MVVM 中,数据绑定是核心特性。视图绑定到 ViewModel 的属性,当属性发生变化时,视图会自动更新。
3. 测试:
- MVC 中,Controller 和 View 耦合紧密,测试起来比较困难,特别是单元测试。
- MVVM 中,ViewModel 是与视图无关的纯 Swift 类,容易进行单元测试。
4. 依赖关系:
- MVC 中,View 和 Controller 之间存在直接依赖,Controller 需要知道 View 的具体实现。
- MVVM 中,View 和 ViewModel 通过绑定和协议进行解耦,View 不直接依赖 ViewModel 的具体实现。
SwiftUI
这是我最最最想夸的点,在我整个学习和实操过程中最佩服的就是苹果的美学思想,实在是太优美了,简洁又高效,感觉轻轻松松就能做出果味十足的各种界面,这在提升审美方面有很大帮助。在视图部分的制作过程中主要就是用到了SwiftUI,目的类似于Android开发中的xml,下面提一下我喜欢的优点。
- 三维画布:通过HStack(Horizontal)、VStack(Vertical)、ZStack(我也布吉岛单词是哪个)等等通用布局来实现复杂的UI效果,ZStack我也是第一次见,像是把布局从二维的画板添加了Z轴,拔高到了三维,有了前后关系。
- 动态布局:在确定不同组件(image、button、Text之类)和布局尺寸时可以很方便的根据屏幕的尺寸动态改变,且属性命名也很统一符合直觉。Space()也非常好用,能自动占满剩余空间。
- 动画优美:基础动画效果的实现可以很简单,通过几行代码就能实现果味十足的各种动画效果。
资源管理
我也特别喜欢Xcode中对图片、颜色等资源的集中管理,色彩集的使用可以很好的实现昼夜模式颜色的切换,用起来也相当顺手可以用各种格式定义颜色。
🍎后记
通过总结反思ios学习的体验让我可以更好的体悟苹果公司的技术思想,当然我这篇不过是些许皮毛,当对我而言已是受益匪浅。
我这几天的ios应用开发体验感觉实属愉悦,也是长了见识,真心建议任何对移动应用开发方面的人可以大胆试试,感受苹果公司的软件开发智慧。