Swift年终大礼包送你了还不来!!!

8,061 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

PS:已经更文7天

1.App protocol苹果新的生命周期代理

Bye-bye AppDelegate

Bye Bye AppDelegate! SwiftUI App Life Cycle

app protocol 苹果弃用了Uikit的代理模式,用了全新的app protocol 来管理应用程序

2.Identifiable通用唯一识别码


遇到比较坑爹事情

  • Identifiable 非常简单实用,主要作用就是作为一个对象的唯一标识
struct listForm: Identifiable {
    
    var id:UUID = UUID()
    
    var name: String
    
    var imgae: String
    
}
  • UUID(id) 是通用唯一识别码(Universally Unique Identifier)的缩写
  • id 必须是小写字母,这是写死的

navigationView用法:


注意⚠️,navigation的用法,navigationtitle是写在{ }里面的

NavigationView{
  
		.navigationTitle(Text("待办清单"))
		
        }    

3.foreach用法:

  • rangle用法
  • id与hashable
  • identifiable与UUID
  • UUID(id) 是通用唯一识别码(Universally Unique Identifier)的缩写
  • Identifiable 非常简单实用,主要作用就是作为一个对象的唯一标识

4.关于定义变量var和let的区别

let: 用于声明+不变量 var :用于声明+变量 不变量的值一旦被定义了就不能再改变。变量则可以在声明后随意赋值

5. guard...else...的用法

guard...else 的用法和 if...else的用法相似

  • guard不需要执行满足条件的闭包,但必须要在闭包必须要有中断当前流程的语句。
  • if...else,要执行满足条件中的内容

闭包:就是圈在{ }中的内容

这里有更加详细的关于guard...else 和 if...else的小结 guard 和 if...else

6.try?的使用

如果不想处理异常则可以选择这个关键字,使用这个关键字可以返回一个可选值类型,如果有一场出来,则返回nil,如果没有异常则返回可以选值。

var name: String? = nil

和string不同,string?,既可以为string,也可以为nil

在 swift 中 nil 是和其他类型严格区分的。改为可选型即可,可选型,就是可以选择,比如 String? 的意思就是可以在 Stringnil 之间选择,可以是 String 也可以是 nil 。如果一个变量定义成 String,那么这个变量就会是 String 类型,而不可能是nil。

小结 try try? try!的用法

  • try 出现异常就处理异常
  • try?出现异常不处理异常,返回nil,没有出现就返回可以选类型
  • try!出现异常就中断程序

7.MVVM模式

思维导图 注:modelview实现具体的业务逻辑

8 json数据的读取

1.创建一个list.json集合

{
    "list":[
        
    {
        "id":1,
        "title":"高数",
        "subtitle":"基础课程"
                
    },
    
    {
        "id":2,
        "title":"线性代数",
        "subtitle":"基础课程"
                
    },
    
    {
        "id":3,
        "title":"计算机",
        "subtitle":"专业课程"        
    }
         
    ]
   
}

⚠️⚠️⚠️!!! json文件中不能存在其它无关的东西比如,我们用swift创建json文件时候,自动为我们生成的文件注释 // 否则将无法读书json文件 例如 例如: 这个是能存在的,我之前在写这个文件的时候,提示我一直报错就是因为我以为这个注释在json文件是生效的。

  • 2.用struct 抽象 出list集合里的属性

比如我们上一个list集合里有:

  • id
  • title
  • subtitle(二级标题)

我们对其抽象成struct以便我们复用(就是重复使用)

struct dataList:Codable,Indentifiable{
	var id:Int
	var title :String
	var subtitle :String
}

注:Codable 的引入简化了JSON 和 Swift 类型之间相互转换的难度,能够把 JSON 这种弱类型数据转换成代码中使用的强类型数据。 Identifiable 非常简单实用,主要作用就是作为一个对象的唯一标识

3.创建struct 用一个list 变量来存储上一个结构的抽象出来的东西(集合)

struct appData:Codable{

	var list[dataList]
	
}

后面我们会将json文件里的数据映射到list集合里面,而里面的属性我们已经通过上一个struct把它给抽象出来。

4.接下来就是通过一个函数方法把json读取进来完成映射

9.AutoCapitalization

  • 控制TextFiled内容输入设置 input

实例

import SwiftUI

struct ContentView: View {
    
    @State var str1:String=""
    @State var str2:String=""
    @State var str3:String=""
        
    var body: some View {
        
        VStack{
            TextField("单词首字母自动大写",text: self.$str1)
                .padding()
                .textFieldStyle(DefaultTextFieldStyle())
                .textInputAutocapitalization(.words)
                .border(Color.blue, width: 2)
                .padding()
            TextField("所有字母自动大写",text: self.$str2)
                .padding()
                .textFieldStyle(DefaultTextFieldStyle())
                .textInputAutocapitalization(.characters)
                .border(Color.blue, width: 2)
                .padding()
            TextField("不能输入大写",text: self.$str3)
                .padding()
                .textFieldStyle(DefaultTextFieldStyle())
                .textInputAutocapitalization(.never)
            
                .border(Color.blue, width: 2)
                .padding()
            
        }
    }
}

运行结果: 在这里插入图片描述

在这里插入图片描述

10.navigationView用法

制作导航栏

toggle()-作为开关的逻辑

在这里插入图片描述

import SwiftUI



struct ContentView: View {
    @State private var setColor: Bool = false
    @State private var setBold: Bool = false
    var body: some View {
        NavigationView {
            
            VStack {
                Text("iotessay.com")
                    .foregroundColor(self.setColor ? Color.red : Color.blue)
                Text("Welcome to my web")
                     .foregroundColor(self.setColor ? Color.gray : Color.blue)
                
                
                
            }
            .padding(20)
            .font(self.setBold ? .largeTitle : .body)
            .border(Color.red, width: 3)
            
            .navigationBarTitle("Main", displayMode:.inline)
            .navigationBarItems(leading: Button(action: {
                self.setBold.toggle()
            }, label: {
                Text("改变字体")
            }), trailing: Button(action: {
                self.setColor.toggle()
            }, label: {
                Text("改变颜色")
            }))
        }
        .border(Color.gray, width: 2)
    }
}