一.更多字符串功能
首先,字符串的更多功能需要倒入Foundation库import Foundation
var foudation_str = " !!!swift and oc !!!!";
// capitalized是把foudation_str所有的字符串的首字母变成大写
var foudation_str1 = foudation_str.capitalized
// uppercased是把foudation_str所有的字符变成大写
var foudation_str2 = foudation_str.uppercased()
// lowercased是把foudation_str所有的字符变成小写
var foudation_str3 = foudation_str.lowercased()
PS:这些方法并不会改变foudation_str本身的值
trim:对字符串头尾给定的字符进行删除
var foudation_str = " !!!swift!!! and oc !!!!";
// 把字符串头尾面的空白去掉
var foundation_str4 = foudation_str.trimmingCharacters(in: CharacterSet.whitespaces)
// 把字符串头尾的空白和!都去掉
var foundation_str5 = foudation_str.trimmingCharacters(in: CharacterSet.init(charactersIn: " !")) // 打印结果是:swift!!! and oc 值得注意的是只会删除头尾两部分 中间的!是没有被删除的
split:字符串截取
var split_str = "welcome to play Swift"
var split_str1 = "welcome to pla!y Swift-swift-swift"
// 表示用“ ”来把这个字符串截取 结果会得到一个数组
split_str.components(separatedBy: " ")
// 表示用" "和!和-来截取
// 打印结果是:["welcome", "to", "pla", "y", "Swift", "swift", "swift"]
split_str1.components(separatedBy: CharacterSet.init(charactersIn: " !-")
二.String.index 和 Range
var range_str = "welcome to play play swift"
// 计算play的range 默认向前往后搜 打印结果:11..<15
String(describing: range_str.range(of: "play"))
//计算play的range 从后往前搜 打印结果:16..<20
String(describing: range_str.range(of: "play", options: String.CompareOptions.backwards))
let starIndex:String.Index = range_str.startIndex
let endIndex:String.Index = range_str.endIndex
// range1的打印结果: 0..<26
let range1 = range_str.index(starIndex, offsetBy: 0)..<endIndex
// range2的打印结果: 2..<26
let range2 = range_str.index(starIndex, offsetBy: 2)..<endIndex
PS:一般range是前闭后开的,所以上述range2的结果中是不包含26的位置的
let offsetIndex = range_str.index(starIndex, offsetBy: 10) // 从起始位置开始 偏移10
let range3 = range_str.index(starIndex, offsetBy: 0)..< offsetIndex // range3的打印结果:0..<10
// 在 0 - 26的区间内 搜索`welcome `在range_st中range 应该是一个可选的 如果搜索不到就返回nil
let serachRange = range_str.range(of: "welcome", range: range1) // serachRange的打印结果:0..<7
subString
var range_str = "welcome to play play swift"
let starIndex:String.Index = range_str.startIndex
let endIndex:String.Index = range_str.endIndex
let toIndex = range_str.index(starIndex, offsetBy: 7)
// sub_to_str的打印结果: welcome
let sub_to_str = range_str.substring(to: toIndex)
// sub_from_str的打印结果:to play play swift
let sub_from_str = range_str.substring(from: toIndex)
// sub_range_str的打印结果:play swift
let range2 = range_str.index(starIndex, offsetBy: 16)..<endIndex
let sub_range_str = range_str.substring(with: range2)
// 插入
let sub_insert_str = range_str.insert("8", at: toIndex)
// 删除了m之后 range_str变成:welcoe to play play swift
let sub_remove_str = range_str.remove(at: fromIndex)
Replace
//replaceStr打印结果:welcome to play 你好
let replaceStr = range_str.replacingCharacters(in: range2, with: "你好")
数组的初始化
Swift中的数组两个特点:
1: 一个数组只能存储一种特定类型的数据 即是说如果要存字符串 都存字符串,要存整数 都存整数, 这点和OC里面是不相同的
2:所存储的数据不一定是一个类的对象,可以是基础数据类型 这点跟OC也是不一样的
Q:如何显式的声明数组里面的数据类型?
使用[String]
或 Array<String>
let arrs0 = ["1","2","3"]
let arrs1:[String] = ["1","2","3"]
let arrs2:Array<String> = ["1","2","3"]
arrs0[0] = "sunshine"
Q:如何创建一个空的数组?
var arrs3 = [String]()
var arrs3 = Array<String>()
Q:如何向空数组里面添加数据?
arrs3.append("4") // 打印的结果:["4"]
// 可以把arrs3的数组里面元素清空,但是不会改变这个数组所能存储的数据类型 如果再加一个
arrs3 = []
arrs3.append(4)是会报错的
arrs3 = [String]()
arrs3 = Array<String>()
// 两个数组合并,打印的结果是["1", "2", "3", "4"] 如果有重复的不会删除 也会出现的
var arrs4 = ["1","2","3"] + arrs3
三.数组的基本操作
var array = ["1","2","3","5","6"]
// 计算数组的长度
array.count
// 来判断数组是否为空
array.isEmpty
// 打印结果:["1", "2", "3", "5", "6", "7"]
array.append("7") // 等价于:array += ["7"]
// 把"8"插入到下标为2的位置
array.insert("8", at: 2)
// 删除下标为2的位置的元素 返回的是删除之后下标为2的位置的元素
array.remove(at: 2) // 返回的结果是'5'
// 删除数组的随后一个元素
array.removeLast()
// 删除数组的第一个元素
array.removeFirst()
// 把数组中的第一个元素换成Sunshine
array[0] = "Sunshine"
// 把数组中对应的2 - 4位置的元素换为"hello world !"
array[2...4] = ["hello","world","!"]
// 把2 - 4的位置的元素都替换成“你好”
array[2...4] = ["你好"]
数组的遍历:
for index in array.count {
// 数组的遍历
print("测试 - \(array[index])")
}
等价于:
for item in array {
print("测试- \(item)")
}
四.字典的初始化
Swift中字典的几个特征:
1.字典存储的是键 - 值 的数据对
2.所存储的数据中,键和值可以是任意数据类型
3.一个字典只能存储固定一种键和值的数据类型的搭配
4.字典里面的数据是无序的
Q:如何显式的声明一个字典的数据类型?
var dict:Dictionary<Int,String>
var dict:[Int:String]
Q:如何清空一个字典?
dictionary = dictionary<Int,String>()
dictionary = [Int:String]()
// 跟数组一样 清空之后并不影响它的key和value的类型
dictionary = [:]
五.字典的基本操作
var dict1 = [1:"A",2:"B",3:"C",4:"D"]
var dict2:Dictionary<String, String> = ["name":"Sunshine","age":"18","sex":"女"]
// 返回的是这个字典中数据对的个数
dict1.count
// 判断字典里面是否有值
dict1.isEmpty
// 访问字典里面的键为1的value
dict1[1]
// value是一个optional的值 因为有可能字典里面没有name这个键
dict2["name"]
// 在字典dict2里面添加一个数据对
dict2["course"] = "数学"
// 修改字典dict2里面键为age的value的值
dict2["age"] = "16"
dict2.updateValue("16", forKey: "age") // 它的返回值是原来的值oldValue
dict2["course"] = nil // 删除字典里面key为course的数据对
dict2.removeValue(forKey: "course") // 返回的值是删除之前的值oldValue
字典的遍历:
for (key,value) in dict2 {
print("测试 - \(key):\(value)")
}
// 字典dict2里面的所有key 数组
dict2.keys
for key in dict2.keys {
print("测试 - \(key)")
}
// PS:dict2.keys的打印结果为:LazyMapCollection<Dictionary<String, String>, String>(_base: ["name": "Sunshine", "age": "16", "course": "数学", "sex": "女"], _transform: (Function))
// 强制转换为Array(dict2.keys)或[String](dict2.keys) 打印结果:["name", "age", "course", "sex"]
// 字典dict2里面的所有value 数组
dict22.values
for value in dict2.values {
print("测试 - \(value)")
}
六.UIKit初探
Q:用Swift语言在view上面加一个label?
let label = UILabel.init(frame: CGRect.init(x: 0, y: 80, width: view.frame.size.width, height: 50))
label.backgroundColor = UIColor.orange
label.font = UIFont.systemFont(ofSize: 14)
label.textColor = UIColor.black
label.textAlignment = NSTextAlignment.center
label.text = "Swift基本语法"
view.addSubview(label)
显示的结果是:
七.Swift - 循环结构
控制流(control Flow):顺序结构/循环结构/选择结构
循环结构: for - in
/for
/while
/ do - while
for - in
for - in
通常用在以下四个地方:遍历区间、遍历字符串、遍历数组、遍历字典
遍历区间:
for i in 0...100 {
print("测试 - \(i)")
}
遍历字符串:
var str = "Hello,Sunshine!"
for c in str {
print("测试 - \(c)")
}
遍历数组:
var array = ["Sunshine","Jack","Candy","Vivian","Sofia","Ann"]
var count = 0
for item in array {
print("测试 - \(count):\(item)")
count++
}
遍历字典:
var dict:Dictionary<String, String> = ["name":"Sunshine","age":"18","sex":"女"]
for (key,value) in dict {
print("测试 - \(key):\(value)")
}
dict.keys // 字典dict里面的所有key 数组
for key in dict.keys {
print("测试 - \(key)")
}
dict.values // 字典dict里面的所有value 数组
for value in dict.values {
print("测试 - \(value)")
}
如果在遍历的过程中,我们对索引并不感兴趣的话 可以使用“_”来代替
var result = 1
var base = 2
for i in 0...10 {
result *= base // 计算2的10次方
}
// 等价于:
for _ in 0...10 {
result *= b
for
for initialization;condition;increments {
statements
}
for i in 0...10 {
print("测试 - \(i)")
}
// 等价于:
for var i = 0;i < 10;i++ {
print("测试 - \(i)") // 在swift3里面已经被废弃了
}
// 等价于:
var i = 0
for ;i < 10;i++ {
print("测试 - \(i)")
}
while 和 do - while
initialization
while condition {
statements
increments
}
initialization
do {
statements
increments
}while condition
八.Swift - 选择结构
if condition {
statements
}else if condition {
statement
}else {
statements
}
var rating = "A"
if rating == "A" || rating == "a" {
print("perfect")
}else if rating == "B" {
print("Just so-so")
}else {
print("Bad")
}
// value支持很多类型:字符串 整型 Bool型 浮点型 元组
switch value {
case pattern1:
code1
case pattern2:
code2
case pattern3:
code3
default:
code
}
// 在switch语句中,不用写break default一般不能省略(如果要能够包含所有的情况 也是可以省略的)
switch rating {
case "a","A":
print("perfect")
case "B":
print("Just so-so")
default:
print("Bad")
}
九.Switch语句的高级用法
var tunples = (1,1)
switch tunples {
case (1,0):
print("X:\(tunples.0) Y:\(tunples.1)")
case (_,1):
print("BBBBB") // _表示不关系元组中的第一个值
case (0,1):
print("CCCCC")
case (0,0):
print("DDDDD")
default:
print("EEEEE")
}
var tunples1 = (1,2)
switch tunples1 {
case (1,0):
print("X:\(tunples1.0) Y:\(tunples1.1)")
case (_,1):
print("BBBBB") // _表示不关系元组中的第一个值
case (1,let y):
print("CCCCC - \(y)") // 表示X=1的元组 y就是这个元组中的另一个值
case (0,0):
print("DDDDD")
default:
print("EEEEE")
}
var tunples2 = (2,2)
switch tunples2 {
case (1,0):
print("X:\(tunples2.0) Y:\(tunples2.1)")
fallthrough
case (0,1):
print("BBBBB") // _表示不关系元组中的第一个值
case let (x,y) where x==y:
print("会来到这里了哦哦哦")
case (0,0):
print("DDDDD")
default:
print("EEEEE")
PS:在switch中如何希望一个case执行完之后还能执行下一个case 用“fallthrough”关键字 但是有一点值得注意的是如果fallthrough下面声明了变量 那就不能使用fallthrough了。
十.控制转移和二维数组
break
braek:是指跳出当前的循环体 而不是仅仅是跳出当前的花括号 也可以用在switch里面 用在switch里面表示的是退出当前的switch语句
例:
var count = 10
for i in 0 ..< 10 {
if i/2 == 0 {
break
}
count += i;
}
// 打印结果:10 count += i 根本没有执行 因为在第一次循环执行后就退出循环了
print("\(count)")
switch count {
case 10:
count += 1
fallthrough
case 0...10:
count += 1
default:
print("default")
}
print("\(count)") // 打印结果:12
}
switch count {
case 10:
count += 1
break
case 0...10:
count += 1
default:
print("default")
}
print("\(count)") // 跳出了switch循环 所以print永远不会被执行
}
continue
continue: 跳过之后的操作 继续当前的循环
Q:如何初始化一个空的二维数组?
var array = Array<Array<Int>>()
var array = Array<Array<Int>>() // 表示二维数组里面存放的数据类型类型是数组 这个数组里面存放的是Int型的数据
var array1:Array<Int> = []
for i in 0..<10 {
array1.append(i)
array.append(array1)
}
print("测试array1 - \(array1)")
print("测试array - \(array)")
print("测试 - \(array[5][3])") // 打印结果是3
//测试array - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
//测试array - [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4, 5], [0, 1, 2, 3, 4, 5, 6], [0, 1, 2, 3, 4, 5, 6, 7], [0, 1, 2, 3, 4, 5, 6, 7, 8], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
一般来说使用break只会跳出当前循环 如果要跳出整个循环的话 可以在最外面一个循环外面加上一个标签 xxx: 然后break xxx
var array = Array<Array<Int>>()
var array1:Array<Int> = []
mainloop: for i in 0..<10 {
array1.append(i)
for j in 0..<10 {
array.append(array1)
array1 = []
if (array[i][j] == 0) {
break mainloop
}
}
}
print("测试array1 - \(array1)")
print("测试array - \(array)")
// 测试array1 - []
// 测试array - [[0]]