Swift分享(基础知识, 网络请求, json解析等)

Swift分享

前言

本人写的swift实战项目
https://github.com/NieYinlong/SwiftDemo
包含Alamofire网络请求, 下拉刷新, SnapKit布局, HandyJSON实现 json解析等
demo gif

目录
  • Swift创始人&简介
  • Swift基础知识点
  • Swift与Objective-C的比较

Swift创始人&简介

Chris Lattner
伊利诺伊大学 PHD
Swift 之父,主要作者
Clang 主要贡献者
LLVM 主要作者

LLVM是Apple官方支持的编译器,而该编译器的前端是Clang,这两个工具都被集成到了Xcode里
Clang: Clang是一个C语言、C++、Objective-C语言的轻量级编译器
美国著名程序员,LLVM项目的主要发起人与作者之一,Clang编译器的作者。他之前是苹果公司编译器开发团队的首席架构师,苹果新编程语言Swift创造者。
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。
Clang是一个C语言、C++、Objective-C语言的轻量级编译器

Swift基础知识点

基础语法

var myString = "Hello, World!"
print(myString)

类型安全, Swift 是一个类型安全(type safe)的语言。
会在编译你的代码时进行类型检查

var varA = 42
varA = "This is hello"
print(varA)
error: cannot assign value of type 'String' to type 'Int'

类型推断&let&var

类型推断:
let num = 42
// num 会被推测为 Int 类型

var & let:
var 声明变量 
var num1 = 42
print(num1)

var num2:Float
num2 = 3.14159
print(num2)

let声明常量
let num3 = 34
num3 = 24 //报错

Swift可选(Optionals)类型

Swift 的可选(Optional)类型,用于处理值缺失的情况。
var optionalInteger: Int?
var optionalInteger: Optional<Int>

var myString:String?
myString = "Hello, Swift!"
if myString != nil {
  print(myString)
}else{
  print("myString 值为 nil")
}

print(myString!)

??:

let username = loginName ?? ""

Swift中的 as、as!、as? 三种操作符如何使用

1. as 从派生类转换为基类,向上转型也可进行数值转换
   let age = 28 as Int
2. as!向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
3. as?as! 操作符的转换规则完全一样。
   但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值。
   由于 as? 在转换失败的时候也不会出现错误,
   所以对于如果能确保100%会成功的转换则可使用as!,否则使用 as?

Swift元祖

//元组(tuples)是由其它类型组合而成的类型。元组可能包含零或多个类型,比如 字符串、整数、字符、布尔以及其它元组。
// 元组:HTTP错误
        // 写法一:
        let error = (404, "Not Found")
        print(error.0)
        print(error.1)
        
        // 写法二:
        let error = (errorCode : 404, errorInfo : "Not Found")
        print(error.errorCode)
        print(error.errorInfo)
        
        // 写法三:
        let (errorCode, errorIno) = (404, "Not Found")
        print(errorCode)
        print(errorIno)

将元组作为函数返回值

func getAHighScore() -> (String, Int) {
 let theName = "Patricia"
 let theScore = 3894
 return (theName, theScore)
}

元祖与字典的比较

优点
	1.	元组的元素个数固定,不允许增加、删除,编译器会严格校验赋值参数个数
	2.	无需定义key,但是必要时可以为数据命名,方便数据访问

缺点:
	1.	不适合存储大量数据,因为元组不支持append、remove等方法
所以说,元组适合应用于组合少量的多元的数据

Swift函数 :

_  省略外部参数
函数1
func funcname(name: String, age: Int) -> String
    {
      return "\(name)\(age)岁"
    }


funcname(name: "李四", age: 23)


函数2
func funcname(_ name: String, age: Int) -> String
    {
      return "\(name)\(age)岁"
    }

funcname("zhansan", age: 23)

Swift泛型

为什么使用泛型, 比如我们交换两个数据, 一类是数值, 一类是非数值, 
如果不使用泛型就要定义两个函数, 有了泛型一个即可
func swapTwoValue<T>(_ a: inout T,  b: inout T)  {
        let temporaryA = a
        a = b
        b = temporaryA
        print("a=\(a), b=\(b)")
    }
  var a = "aa"
  var b = "bb"
  swapTwoValue(&a, b: &b)

闭包

Swift中的闭包与C和Objective-C中的blocks有点类似。
{(parameters)-> returnTypein
statements
}
闭包可放在方法参数里面, 也可以当成函数返回值, 多用于异步回调
捕获
闭包可以在其定义的上下文中捕获常量或变量。
即使定义这些常量和变量的原作用域已经不存在,
闭包仍然可以在闭包函数体内引用和修改这些值。
//makeIncrementor函数返回值是一个()->Int类型的函数
    
    func makeIncrementor(amount: Int)->()-> Int {
        var runningTotal = 0
        func incrementor()-> Int {
            runningTotal += amount
            return runningTotal
        }
        return incrementor
    }
    
    //闭包捕获amount参数的值,然后每次都可以使用
    let incrementByTen = makeIncrementor(amount: 10)
    print(incrementByTen())//10
    print(incrementByTen())//20
    print(incrementByTen())//30

逃逸闭包

Swift 3.x中, 闭包参数默认是非逃逸类型
func testHttpRequest(success:@escaping (_ msg: String)->Void) {
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(2*NSEC_PER_SEC))/Double(NSEC_PER_SEC)) {
            success("请求结果")
        }
        print("函数结束")
}

调用
testHttpRequest { (msg) in
     print(msg)
}

Swift流行第三方库

Alamofire 网络请求库
Cocoa pods导入 pod ‘Alamofireimport Alamofire

Alamofire.request("https://httpbin.org/get", method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
           
if(response.error == nil){
//请求成功               
} else {
       //请求失败        
   }            

}
(test .get枚举) 

布局

SnapKit:自动布局框架,类似于OC中的Masonry。
titleLbl.snp.makeConstraints { (make) in
    make.left.equalTo(AdaptW(24))
    make.right.equalTo(-AdaptW(24))
    make.top.equalTo(AdaptH(12))
}

json和model互相转换

HandyJSON:
实现JSON转Model
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SwiftUI 中,可以使用 `URLSession` 和 `Codable` 协议来解析 JSON 数据。以下是一个简单的示例: 首先,定义一个结构体来表示 JSON 数据的模型: ```swift struct MyData: Codable { let name: String let age: Int } ``` 然后,使用 `URLSession` 发起网络请求,并使用 `JSONDecoder` 解码 JSON 数据: ```swift class MyViewModel: ObservableObject { @Published var myData: MyData? func fetchData() { guard let url = URL(string: "http://example.com/mydata.json") else { return } URLSession.shared.dataTask(with: url) { data, response, error in if let data = data { do { let decoder = JSONDecoder() self.myData = try decoder.decode(MyData.self, from: data) } catch let error { print(error.localizedDescription) } } }.resume() } } ``` 在视图中使用 `@ObservedObject` 来观察 ViewModel 对象,并在视图中显示数据: ```swift struct ContentView: View { @ObservedObject var viewModel = MyViewModel() var body: some View { VStack { if let myData = viewModel.myData { Text(myData.name) Text("\(myData.age)") } else { Text("Loading...") } } .onAppear { viewModel.fetchData() } } } ``` 在这个示例中,我们使用 `URLSession` 发起了一个网络请求,并使用 `JSONDecoder` 解码了 JSON 数据。然后,我们将解码后的数据存储在 `@Published` 属性中,并在视图中使用 `@ObservedObject` 来观察 ViewModel 对象的变化。最后,在视图的 `onAppear` 回调中调用 `fetchData()` 方法来获取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值