跳转至

CS193p

约 1152 个字 70 行代码 预计阅读时间 5 分钟

Lesson. 1⚓︎

参考链接

很遗憾,2023年寒假弃坑了。我个不敢坚持的傻狗啊。 - 官方网站 - B站视频链接🔗

Lego积木的比喻:

Note

Swift:函数式编程的语言,同样支持面向对象等性能

  • some view: 每一个都是“某种视图”,通过一块一块地组装起来形成了页面。

  • .padding :视图修饰符?

“组合积木”

有标签参数:cornerRadius:25这种

Lesson. 2 大量的小视图 View⚓︎

  • 每个变量都必须要有值!Have Value!
  • @State : 在构建程序时候不会经常使用,只在暂时需要的地方使用它
  • 视图View中可以有if 但是不能用for循环
  • 强类型的!
  • identifiable:一个常见的报错:必须要有一个唯一的id?
ForEach(emojis, id :.\self, ....)
// 仅仅把自己作为一个id,意味着有重复元素的话会同时变化?
Spacer()
// 把没有控件想要的地方全部占满🈵️了

Lesson.3 MVVM / Swift Type System⚓︎

设计范式: Model-View-ViewModel: MVC:以前的构建iOS应用的方式

(view)User Interface(视图)与后端的程序(Model)

  • Model:完全独立于UI, Data + Logic,并且这些数据和逻辑仅仅存在于Model中,不会进入到用户界面的变量中去。
  • View:应用程序如何呈现给用户:反应当前用户的状态。(stateless)@state符号不用来储存相关数据,只是促进UI中的某个阶段的动作
  • Declared / Reactive 声明式的/响应式的
  • 视图只是body var状态的一种显示,在body var中我们声明了我们的UI看起来像是什么,唯一一种改变它的方式是redraw整个画面

    • 以前的时候我们是命令式编程,一个接一个地调用函数,随着时间推移把UI拼接在一起!
  • ViewModel:视图绑定到模型上! Interpreter(M和V之间的解释器),把各种数据从model中转换成View可以使用的形式。

  • 👆GateKeeper/Notice Changes!
  • VM不能获得关于View的结构的信息

  • View必须只能通过向ViewModel请求数据来从Model获取数据。

  • View 自动地获取数据的变化,然后重构!

  • UI怎么吧改动传递给Model呢?

  • View会给VM发出一些Call,VM把意图传递Model

Varieties Of Types⚓︎

  • struct

  • 存储变量

  • 计算变量
  • 常数 let xxx
  • func(tions)

    函数的内部称法和外部的

    struct RoundedRectangle{
        init(){
    
        }
    }
    
    struct 是值类型(在传递和赋值的时候会复制;copy on write;functional programming;没有继承;mutability:可变性);

    首选的数据结构!struct,大部分都是struct,View是个protocal 而class是引用类型(通过指针进行传递;自动引用计数而不是垃圾收集(Swift会追踪某一块有多少指针指向,如果是0就删除);OOP;有单继承;一直是可变的)

    Array也是一个结构体,(是否可以加入删除?一定要用var / let来显式声明)

  • class:在特定的情境下常用
  • class,MVVM的ViewModel通常用class 来实现;UIKit(老的构建iOS的方式)
  • protocal(view)

  • 'dont care' type(范型?) Genetics:不想指定类型的时候用来制定,比如Array<Element>,可以有多个dont care 在其中?

  • enum

  • functions as TYpes:

    var operation :(double)->double

    operation = square() operation(4) // 16

    operation = sqrt operation(4) // 2

    • closures:闭包!

VM 👇有: 类型/静态方法等:static func / static var emojis = [] - 本质上是一个全局的变量,但是加了命名空间的限制,使得仅可以加入命名空间后调用使用。

MVVM 先有View, 接着设计Model,注意private(set)【可以在外界被更改?】 ViewModel要通过类class来实现,而不是只有struct (model中init来初始化)


响应式编程:⚓︎

  • mutating (对于Model中需要改变的部分,表明在内部是可变的,VM中;
  • ObservedObject(对于ViewModel的部分加入),ObservableObject:声明ViewModel
  • Published(对于ViewModel 引用 Model 的部分)
  • 数据在ViewModel中进行设置

enum⚓︎

enum FastFood {
    case hamburger(numberOfPatties: Int)
    case fries(size: FryOrderSize)
    case drink(String, ounces: Int)
    case cookie
}

enum FryOrderSize{
    case large
    case small
}
- 只有离散的数值 - 类似一个struct,被复制 - 每一个离散的value都可以有一个状态

var menuItem = FastFood.hamburger(numberOfPatties: 2)
switch menuItem {
    case FastFood.hamburger:print("burger")
    case FastFood.fries: print("Fries")
    default: print("Other") 
}
  • 更加复杂情况下的使用:检查enums的参数情况
var menuItem = FastFood.hamburger(numberOfPatties: 2)
switch menuItem {
    case .hamburger(let numberOfPatties): print("A burger with \(numberOfPatties) patties!") // 这里用到了类型推断
    case FastFood.fries: print("Fries")
    case drink(let brand, let ounces): print("\(brand)") // 可以给之前没有声明名称的参数声明名称
    default: print("Other") 
}
  • enum 也可以有方法,但是不可以存储数据,只能用来计算;
enum FastFood{
    ...
    func isIncludedInRightOrder(number: Int) -> Bool{
        switch self {
            case .hamburger(let numberOfPatties): return number == numberOfPatties
        } // 检查enum中元素是否符合某种条件
    }
}
  • internal name 和 external name
func index(of card : Card){

}
  • 上面的of就是外部名称,card是内部名称,在外面引用这个函数的时候就可以使用 index(of: a),传入a,
  • 即使是把struct赋值给一个变量,也会进行一次“复制”

Optionals⚓︎

  • optional 就是enum类型。
  • 泛型
  • 有些值不知道是啥,所以swift引入了很多语法糖
enum Optional<T>{
    case none
    case some(T)
}
var hello: String? // hello 实际上是一个枚举!!Optional String
var hello: String?
var hello: String? = "hello"
var hello: String? = nil // 意思是 Optional.none

print(hello!) 
// 在Optional处于特定状态的时候,输出,如果是none就坍塌 (强制解包)
if let safehello = hello {
    print(safehello)
}
else{
    ...
}
  • nil coalescaling operator

let x: String? = ... let y = x ?? "foo" // 设置默认值 let y = x?.foo()?.bar()?.z

  • 可选链,如果foo声明了,就访问foo,如果有bar就访问bar,一旦有一个是none的话,就返回nil

  • where CardContent: Equatable