前言
现在的swift也算是成熟了吧,感觉再不学习swift就要被淘汰了,以后做一下学习swift的笔记。想做的时候就做点,忘记写笔记了就不写了,随性一点 ----自己胡扯
swift和OC的不同
应该是有很多不同点只记录其中的一点
- 初始化() 代替 alloc / init
let btn = UIButton()
- 访问属性可以不同self, 直接使用属性名
view.addSubview(v)
- 类方法就是方法名字前面加了static
- 一行一句时不用使用
;
结尾J - 枚举类型可以直接使用
.枚举值
调用 - @selector 变为 #selector()监听方法,,带参数不用使用冒号‘:’
- 打印方法名使用 #function
一些技巧
- option + cmd + / 出现注释斜线
- 输入color后回车有奇迹
- 标注
3.1 // MARK: - 标注1
3.2 // MARK: 标注2
3.2 // TODO: 要做的
3.4 // FIXME: 要修改的 -
iv.image = #imageLiteral(resourceName: "hhhha")
--->这个在代码中不是这样的 输入图片名字后回车显示图片很好看 - 任何不同的类型之间,不允许直接计算,需要显示转化 例如
Int(a)
- swift不存在基本数据类型,都是结构体
- 先使用
let
生命变量,需要改时再用var
- 使用
!
强制拆包时要确定变量有值 - 仅仅一个
()
表示空执行 - if let/var else 连用判断可选类型是否为空
iflet-else 和guard let-else-return
func f() {
let oName: String? = nil
let oAge: Int? = nil
if let name = oName, let age = oAge {
print(name + String(age)) // oName和oAge都不为空才执行,name 和age只能在这个区域中访问
} else {
print("nil") // 执行 oName和oAge有一个为nil值便执行else语句
}
// 如果oName和oAge有一个为nil值,执行else后面的语句,然后return(不能少), 如果oName和oAge都不为空,跳过else语句继续执行,name和age可以访问了
guard let name = oName, let age = oAge else{
print("nil") // 执行
return // 退出了
}
print(name + String(age))
}
100个tipz中优雅的使用if let,其中有一个为nil便结束了
if let value = JSON(json)["menu"]["popup"]["menuitem"][0]["value"].string {
print(value)
}
switch
/*
1. swift 可以直接对任意类的值进行分支, 不再局限于整数
2.一般不需要break
3.可以使用',',分开多值
4.所有分支至少需要一条指令,如果什么都不干才使用break
5.swift中 可以进行复制和使用where字句
*/
func demo(num: String) {
switch num {
case "10", "9":
print("优秀")
default:
print("一般")
}
}
demo(num: "9")
func f2() {
let point = CGPoint(x: 10, y: 10)
switch point {
case let p where p.x == 0 && p.y == 0:
print("原点")
default:
print("11")
}
}
for循环
for i in 0..<5 {
print(i)
}
let r2 = 0..<5 // 类型 CountableRange<Int>
let r1 = 0...5 // 类型 CountableClosedRange<Int>
print(r1) // 0...5
for i in (0...5).reversed() {
print(i)
}
字符串
// 字符串遍历
let str = "今天天气不错"
for c in str.characters {
print(c)
}
// 字符串长度
print(str.lengthOfBytes(using: .utf8)) //返回指定编码的字节 一个汉字3个字节
print(str.characters.count) //6 字符串长度,返回字符的个数
let ocStr = str as NSString // 值 as 类型 --> 类型转换
print(ocStr.length) // 6
// 字符串拼接
let name = "老王"
let age = 18
let title: String? = "BOSS"
let point = CGPoint(x: 1.0, y: 2.0)
let str = " \(name) \(age) \(title ?? "") \(point)" // 老王 18 BOSS (1.0, 2.0)
// 格式化
let h = 8
let m = 9
let s = 6
let dateStr1 = String(format: "%02d:%02d:%02d", h, m, s) // 08:09:06
字符串的子串
// 一般使用NSString作为中转, 因为Swift取子串的方法一直在优化
let str = "我们一起加油!"
print(str.substring(from: "我们".endIndex)) // 一起加油!
print(str.substring(to: "asd".endIndex)) // 我们一
func hh() {
let str = "我们一起加油!"
guard let range = str.range(of: "一起") else {
print("meiyou zhao dao")
return
}
print(str.substring(with: range))
}
// 转换成OC
let ocStr = str as NSString
let s1 = ocStr.substring(with: NSRange(location: 2, length: 3)) // 一起加
print(s1)
print("------")
let greeting = "Guten Tag!"
greeting[greeting.startIndex] // G
greeting[greeting.index(after: greeting.startIndex)] // u
greeting[greeting.index(before: greeting.endIndex)] // !
let index = greeting.index(greeting.startIndex, offsetBy: 7)
greeting[index] // a
//greeting[greeting.endIndex] // error 越界
for index in greeting.characters.indices {
print("\(greeting[index]) ", terminator: "") // G u t e n T a g !
}
var welcom = "hello"
welcom.insert("!", at: welcom.endIndex) // hello!
welcom.insert(contentsOf:" there".characters, at: welcom.index(before: welcom.endIndex)) // "hello there!"
welcom.remove(at: welcom.index(before: welcom.endIndex)) // hello there
let range = welcom.index(welcom.endIndex, offsetBy: -6)..<welcom.endIndex
welcom.removeSubrange(range) // hello
数组
let array = ["张三", "小芳", "小样"]
let p1 = CGPoint(x: 1, y: 2)
let arr1 = ["张三", 1, p1] as [Any] // arr1 中元素的类型为 Any
数组的遍历
数组反向遍历可以避免删除操作时造成的崩溃, 例如,删除数组中的一个后继续操作数组,正向遍历,删除一个后元素后,后面的元素向前补齐,序号和一开始就不一样了。。。 后续遍历时,删除其中的一个,后面的元素向前补齐,后面的元素就已经操作过了,
let array = ["张三", "小芳", "小样"]
for i in 0..<array.count {
print(array[i])
}
for s in array {
print(s)
}
for s in array.reversed() {
print(s)
}
// 3.enum block 遍历 同时遍历下标和内容
for e in array.enumerated().reversed() {
print(e) // e 为元组类型 (offset: Int, element: String)
print(e.offset)
print(e.element)
}
/*
2, 小样
1, 小芳
0, 张三
*/
// 4.遍历下标和内容
for (n, s) in array.reversed().enumerated() { // 错误的反序遍历 索引和内容不一样
print("\(n), \(s)") // n 索引下标 s 对应的元素 n、s名字随便起
}
/*
0, 小样
1, 小芳
2, 张三
*/
for (n, s) in array.enumerated().reversed() { // 正确的反序遍历 应该先枚举再反序
print("\(n), \(s)") // n 索引下标 s 对应的元素 n、s名字随便起
}
/*
2, 小样
1, 小芳
0, 张三
*/
var array = ["张三", "小芳", "小样"]
// 追加元素
array.append("老王")
// 修改
array[0] = "李四"
//array[5] = "呵呵哒" // 数组越界
// 删除
array.remove(at: 2)
array.removeLast()
array.removeFirst()
array.removeAll()
array.removeAll(keepingCapacity: true) // 删除全部保留空间 bool值只有true 和 false
数组的容量
func dd() {
var array: [Int] // 声明
array = [Int]() // 初始化
var array2 = [Int]() // 声明和初始化一起
for i in 0..<8 {
array2.append(i)
print("\(array2) 容量 \(array2.capacity)")
}
/* 插入元素时,如果容量不够会✖️2(初始为0,第一次就是2), 如果容量不够会在现有的基础上乘以2,可以避免每次都分配空间
[0] 容量 2
[0, 1] 容量 2
[0, 1, 2] 容量 4
[0, 1, 2, 3] 容量 4
[0, 1, 2, 3, 4] 容量 8
[0, 1, 2, 3, 4, 5] 容量 8
[0, 1, 2, 3, 4, 5, 6] 容量 8
[0, 1, 2, 3, 4, 5, 6, 7] 容量 8
*/
}
// 如果初始化指定容量,可以避免插入数据时,重复分配空间,效率会高一点点
//NSMutableArray *arrM = [NSMutableArray arrayyWithCapacity:10];
// 数组的合并
var arr = ["1", "2", "3"]
let arr2 = ["🙄", "😀", "💔"]
let arr3 = arr + arr2 // 要合并的两个数组的类型必须一致 ["1", "2", "3", "🙄", "😀", "💔"]
字典
// 1.定义
var dic = ["name": "张三", "age": 18] as [String : Any]
let array = [
["name": "张三", "age": 18],
["school": "jialidun", "score": 00]
]
/*
所有对象能被转成JSON(字典或者数组) 必须遵守:
1.节点是数组/字典
2.所有对象必须是 NSString, NSNumber or NSNull, NSArray、NSDictionary可以嵌套使用
3.所有的KEY都是NSString
4.NSNumber不能为nil或者无穷大
*/
print(array)
// 增删改 是通过KEY取值的 KEY唯一 如果KEY不存在就是新增,KEY存在就是修改
dic["title"] = "新增加的"
dic["name"] = "改过名了"
dic.removeValue(forKey: "age")
// 字典是通过KEY来定位值的,KEY必须是可以’hash 哈希‘的 MD5 是一种
// hash 就是将字符串变换成唯一的’整数‘ ,便于查找,提高字典遍历的速度
// 遍历
for e in dic {
print(e) // e 的 类型 (key: String, value: Any)
print(e.key)
print(e.value)
}
for (key, value) in dic {
print("\(key): \(value)")
}
// 合并
// 字典不能直接相加
let dic2 = ["name": "😑", "school": "🏠"]
for e in dic2 {
dic[e.key] = dic2[e.key]
}
心态变则意识变,意识变则行为变,行为变则习惯变,习惯变则性格变,性格变则命运变。