ios原生开发初体验

ios原生开发初体验

🍎前言

机缘巧合之下参加了“移动应用创新赛”,借此机会被迫主动接触ios应用的开发相关方面的知识与技术,也因此有了这篇文章,来记录下我的感受。从开始学习到这篇文章开始撰写,约一周时间,估摸着每天断断续续敲三四个小时左右,自认为收获颇丰。

Swift语言

我一上来就直接跟着apple官网的开发者教程走的,基础语法就嫖了眼菜鸟教程的目录,就按照官网教程直接开始敲代码了

语法糖

讲讲我喜欢的几个语法糖(不全),就一些语法看和python很像

  • **换行:**直接用换行来分割代码行,省去了敲;的步骤,必须点赞。我认为分号的意义在软件开发中就是为了恶心人,一行代码写完直接回车既能分割代码有能保持可读性,何乐而不为呢,没必要多此一举以结尾。

  • **类型推断:**这让定义变量时又可以少敲一点代码,像是Int、String、double、bool这些常用到的基础数据类型可以直接通过赋初值来由编译器自动判断

    let message = "Hello, World!"  // 推断为 String 类型
    var count = 10  // 推断为 Int 类型
    
  • 简化 for-in 循环:简化了遍历数组和字典的语法。

    let 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
let incrementer: () -> Int = {
    total += incrementAmount
    return total
}

在这个例子中,闭包捕获了 totalincrementAmount。这些变量被捕获为引用,闭包内可以通过这些引用访问和修改它们。

  1. 堆存储

当闭包捕获一个变量时,如果这个变量在闭包执行结束后仍需存在,那么这个变量会被存储在堆上,而不是栈上。这样可以确保即使闭包执行结束后,这些变量仍然存在。

func makeIncrementer(incrementAmount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += incrementAmount
        return total
    }
    return incrementer
}

在这个函数中,当 makeIncrementer 返回时,totalincrementAmount 被捕获到堆上,因此 incrementer 闭包可以在函数返回后继续访问这些变量。

  1. 自动引用计数(ARC)

Swift 使用自动引用计数(ARC)来管理内存。当闭包捕获一个变量时,ARC 会增加这个变量的引用计数,确保变量在闭包存活期间不会被释放。当闭包不再使用时,ARC 会减少引用计数,并在没有其他引用时释放变量。

let incrementByTwo = makeIncrementer(incrementAmount: 2)
print(incrementByTwo())  // 输出 2
print(incrementByTwo())  // 输出 4

在这个例子中,incrementByTwo 持有 incrementer 闭包的引用,因此捕获的变量 totalincrementAmount 也不会被释放。当 incrementByTwo 被调用时,闭包中的代码可以继续访问和修改 totalincrementAmount

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应用开发体验感觉实属愉悦,也是长了见识,真心建议任何对移动应用开发方面的人可以大胆试试,感受苹果公司的软件开发智慧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值