Osheep

时光不回头,当下最重要。

Swift - 基本语法(二)

一.更多字符串功能

首先,字符串的更多功能需要倒入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 - 基本语法(二)》

显示效果.png

七.Swift – 循环结构

控制流(control Flow):顺序结构/循环结构/选择结构
循环结构: for - inforwhile/ 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]]
点赞