Swift分享
前言
本人写的swift实战项目
https://github.com/NieYinlong/SwiftDemo
包含Alamofire网络请求, 下拉刷新, SnapKit布局, HandyJSON实现 json解析等
目录
- 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 ‘Alamofire’
import 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