1.swift特色
- swift取消了预编译指令包括宏
- 提供了类似Java的命名空间,泛型,运算对象重载
- 对foundation框架做了重载,将其绝大部分class转换为struct
- swift是弱语言,不会对类型做隐式转换,不同类型之间不能直接运算,需要手动转换
- 变量和常量类型不给定,会根据赋值情况自动推导
- 不存在基本的数据类型,Int,Double,CGFloat等都是结构体
2.资源
- 官方网站: https://swift.org
- 官方swift 4 电子书
3.差异
- 访问当前属性不用谢self. 闭包中访问需要使用self.
- 基本不用;分割语句
- 枚举类型不用写全名,直接.类型(UIButtonTypeContactAdd —> .contactAdd)
- target - action的变化: @selector(buttonClick:) –> #selector(buttonClick(_ :))
- 标记提示: //MARK: //TODO: //FIXME: //
- if条件语句可以不适用()
4.可选项optional
let x: Optional = 10
let x: Int? = 10
print(x) 结果都是 optional(10)
- 可选项不能直接参与计算
- optional可能有值,可能没值
- !可以进行强行解包,没有值得时候,强行解包是出错的
5.可选项处理if let和guard let和??
let name:String?
let age:Int?
//方法1: 可以连续判断
// if var 连用可以修改{变量的值,新变量的作用域仅仅在{}内起作用}
if let name = name, let age = age {
print(name + String(age))
}
//方法2: 可以连续判断
guard let name = name, let age = age else {return}
print(name + String(age))
//方法3
print(name ?? "" + String(age))
函数调用
override func viewDidLoad {
getUserInfo("iOS",25)
}
fun getUserInfo(_ name:String?, _ age:Int?) -> () {
//使用同名的变量接收值,后面使用的值是非控制,不用考虑解包的问题和变量起名的问题,if let 只在{}内有效,guard let只在后面有效
guard let name = name, let age = age else {return}
print(name + String(age))
}
解析json的好处
//省去了复杂的if else 的判断
if let jsonDic = json as? NSDictionary,
let menu = jsonDic["menu"] as? [String: Any],
let popup = menu["popup"],
let popupDic = popup as? [String: Any],
let menuItems = popupDic["menuitem"],
let menuItemsArr = menuItems as? [Any],
let item0 = menuItemsArr[0] as? [String: Any],
let value = item0["value"]
{
print(value)
}
6.for循环
let range1 = 0..<10
let rang2 = 0...10
//0..<10 代表[0.10)
for i in 0..<10 {
print(i)
}
//0...10 代表[0.10]
for i in 0...10 {
print(i)
}
//反转
for i in (0...10).reversed {
print(i)
}
//数组输出
for i in arr {
print(i)
}
//数组输出
for (index,value) in arr.enumerated() {
print(index)
print(value)
}
7.switch语句case值变化
- switch可以对任意类型的值进行分支判断
- 一般不适用break
- 不在使用多个case的穿透作用,而是使用case “a”,”b” :进行判断
- 可以使用where筛选语句
var value:(Int,String) = (1,"小明")
switch value {
case let (x,y) where x < 60:
print("不及格")
default:
print("及格")
}
8.字符长度,拼接,格式化
let str = "hello word 中国"
//字符串长度,返回字符的个数
print(str.count)
//返回指定编码对应的字节数量 utf8编码(0~4)个,每个汉字是3个字节
print(str.lengthOfBytes(using: .utf8))
let name = "中国"
let age = 65
let rank:String? = "第二名"
let descStr = "\(name)\(age)\(rank ?? "")"
let hh = 12
let mm = 3
let ss = 45
let time = String(format:"%2d:%2d:%2d",hh,mm,ss)
9.数组
//可变数组用var修饰,let修饰不可变数组
//同类数据类型
let arr = [1,2,3] ---> [Int]
//不同类类型
let arr2 = ["avc",1] ---> [AnyObject]
//其他写法
let arr3 = [Int]()
let arr = [1,2,3]
print(arr)
//下标
for i in 0..<arr.count {
print(arr[i])
}
//for in
for item in arr {
print(item)
}
//block
for (index,value) in arr.enumerated() {
print(index,value)
}
//元组 let e: (offset: Int, element: Int)
for e in arr.enumerated() {
print("\(e.offset)--\(e.element)")
}
//反向遍历--先枚举在遍历
for e in arr.enumerated().reversed() {
print("\(e.offset)--\(e.element)")
}
//添加
arr.append(4)
arr[5] = 5
//删除

//数组合并: 元素必须是同类型才能合并
let view = UIView()
let arr1:[Any] = ["avc",1,view] --> [NSObject]
let arr2:[Any] = [1,3,2]
arr1 + arr2
10.字典
//可变用var修饰,let修饰不可变
//字典中的key必须是唯一的
//let dict: [String : Any]
let dict = ["name":"中古","age":14] as [String : Any]
//let arr: [[String : Any]]
let arr = [
["name":"张三","age":14],
["name":"李四","age":15]
]
//最常用的类型
//let jsonArr: [[String : Any]]
let jsonArr: [[String: Any]] = [
["name":"张三","age":14],
["name":"李四","age":15]
]
//元组遍历
for item in dict (
print(item.key,item.value)
)
//key,value
for (key,value) in dict (
print(key,value)
)
//注意
dict1 + dict2是不合法的,只能遍历一个往另一个中添加