Swift简单学习

Swift简单学习

之前一直停留在使用OC的阶段,现在swift5都出来了,也是时候抽空学习一下了。

Swift 是一门类型安全的语言
Swift的基本数据类型:Int、UInt、Float、Double、Bool、String、Character、Optional
Swift提供的数据集合:元祖、Array、Set 和 Dictionary

元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。

Swift也支持如java一般的三元运算符:x ? x : x
需要注意的是:Swift不支持 ++xx--等自增运算,如果想实现此类功能,请使用:x += 1 或者 x -= 3

如果想比较两个对象是否恒等:Swift 也提供恒等(===)和不恒等(!==)这两个比较符来判断两个对象是否引用同一个对象实例。

空类型:nil

示例:

import Foundation

print("Hello, World!")

这就是完整的例子,swift没有所谓的main()入口函数,全局作用域中的代码会被自动当做程序的入口点,所以你也不需要 main() 函数。你同样不需要在每个语句结尾写上分号。


使用 let 来声明常量,使用 var 来声明变量。

//自动推断类型
var a = 45
a = 50
//显示的声明类型
var dou:Double = 5.9
//常量
let b = 56

//可空变量(Optional),跟kotlin一样的用法
var vEmpty:String? = "可空属性"
//使用可空属性的时候,可以为其设定默认值,跟kotlin里的 ?: 一样的意思
var mVaule = vEmpty ?? "这是默认值" 

//值得注意的是:所有的强制类型转换返回了来的都是一个可空的属性(Optional),例如:
var optNumber = Int("123")
//此时optNumber是一个 Int? 类型

值永远不会被隐式转换为其他类型。如果你需要把一个值转换成其他类型,请显式转换。
例如数字转字符串:

let label = "这是一个标签"
let width = 89
let labelAndWidth = label + String(width)
//有一种更简单的把值转换成字符串的方法:把值写到括号中,并且在括号之前写一个反斜杠 \()
let labelWidthTwo = "新的字符串合并方式:\(width),\(label)"

使用 方括号 [] 来创建 数组 字典 ,并使用下标或者键(key)来访问元素。 最后一个元素后面允许有个逗号。
数组和下标都是用方括号表示:

数组:

//数组
var array = ["元素1","元素2","元素3","元素4",]
let y1 = array[0]
array[1] = "元素2被更改过"
//移除一个元素
array.remove(at: 3)
//在后面追加一个元素
array.append("这是追加的元素5")
//数组的长度
let size = array.count
print("长度:",size," 内容:",array)

//声明一个空白数组
var arrayEmpty:[String]
//空数组必须先初始化
arrayEmpty = [String]()
//可以使用空白数组了
arrayEmpty.append("111")
print(arrayEmpty)

以上程序执行结果:

长度: 4  内容: ["元素1", "元素2被更改过", "元素3", "这是追加的元素5"]
["111"]

字典:

//字典
var map = [
    "key0":"第1个元素",
    "key1":"第2个元素",
    "key2":"第3个元素",
    "key3":"第4个元素",
]
//使用
let item0 = map["key0"]
//赋值
map["key1"] = "修改过的元素2"
//移除某个值,或者移除全部 removeAll(keepingCapacity: true) 传递true可以在删除数组元素后保留其现有容量。默认值为false。
map.removeValue(forKey: "key2")
print("字典:",map,"\n")

//声明空白字典
var mapEmpty:[String:String]
//空白字典必须初始化才可以使用
mapEmpty = [String:String]()
//使用
mapEmpty["key"] = "value"
print("空白字典:",mapEmpty,"\n")

以上程序执行结果:

字典: ["key0": "第1个元素", "key3": "第4个元素", "key1": "修改过的元素2"] 

空白字典: ["key": "value"] 

以上的 数组 字典,如果类型信息可以被 推断出来,你 可以用 [] 和 [:] 来创建空数组和空字典——比如,在给变量赋新值或者给函数传参数的时候。


if语句的使用,if后不需要接小括号,需要注意的是,if 配合 let 以及 可空属性,可以比较优雅的判断属性是否是空的(称为 可选绑定),看示例:

//if语句不需要像java一样需要小括号
var number = 100
if number == 50 {
    print("number的值为:\(number)")
}else if number > 0 && number <= 100{
    print("number的值范围:大于0,小于或等于100")
}else{
    print("无法识别")
}

//if配合let 以及 可空的属性 使用,如果属性是空的,那将会不通过if
var name:String? //如果这个有值,将会进入if ,如果没值,将不会进入
if let n = name {
    //这里定义的 n 作用域仅仅是 if 里面, else里都不能用
    print("name不是nil ,name=\(n)")
}else{
    print("name是nil")
}

以上程序执行结果:

number的值范围:大于0,小于或等于100
name是nil

循环
swift中,循环有for in,while,repeat .. while三种循环,唯一要说明的是repeat .. while循环其实就是java中的,do..while循环,能保证循环体必定会执行一次,所有循环都在下面的例子中。
例如:

print("遍历数组")
let farray = ["张三","李四","王武",]
for item in farray{
    print(item)
}
//注意了,可以使用enumerated()方法,把数组的下标也遍历出来
print("\n带下标循环数组")
for (index,item) in farray.enumerated(){
    print("下标:\(index)  值:\(item)")
}

print("\n遍历字典:")
let fmap = ["name":"CYH","address":"guangzhou","hometown":"nanning"]
for (key,value) in fmap {
    print("字典的内容:\(key) : \(value)")
}

print("\n while循环")
var wf = 0
while wf < 10 {
    print("wf=\(wf)")
    wf += 1
}

print("\n repeat..while循环")
//swift中的repeat..while循环其实就是java里的do..while循环,它能保证循环体必定会执行一次
var dwf = 0
repeat {
    print("dwf=\(dwf)")
}while dwf > 0


//使用区间循环
//使用 ..< 创建的范围不包含上界,如果想包含的话需要使用 ...
for i in 0..<3{
    print(i)
}

//swift中还有很多区间运算:
//array[2...]
//array[...4]
//array[..<6]

以上代码执行结果:

遍历数组
张三
李四
王武

带下标循环数组
下标:0  值:张三
下标:1  值:李四
下标:2  值:王武

遍历字典:
字典的内容:address : guangzhou
字典的内容:hometown : nanning
字典的内容:name : CYH

 while循环
wf=0
wf=1
wf=2
wf=3
wf=4
wf=5
wf=6
wf=7
wf=8
wf=9

 repeat..while循环
dwf=0
0
1
2

元祖
元组(tuples)把多个值组合成一个复合值。元组内的值可以是任意类型,并不要求是相同类型。如果未命名的情况下,将会以下标012345...的形式使用,命名了就以名称使用

//元祖中可以存储不同类型的数据,如果未命名的情况下,将会以下标012345...的形式使用,命名了就以名称使用
let tuples = ("CYH",49,true)
print("\n元祖的使用:\(tuples.0)、\(tuples.1)、\(tuples.2)")
//命名元祖
let tuplesname = (tname:"Cyh",age:25)
print("\n使用命名元祖:\(tuplesname.tname)、\(tuplesname.age)")

函数:
在Swift中,函数是有函数名、参数、返回值类型组成,函数也是一种类型,可以当成参数传递,也可以当返回值返回,函数参数默认是常量。试图在函数体中更改参数值将会导致编译错误。其格式如下:

func 函数名(参数名:参数类型)->返回值类型{
    //你的代码
}

与java、kotlin等都不同的是,swift中的返回值使用->箭头表示的。

func sayHello(name:String)->String{
    return "Hello \(name)"
}
//调用
sayHello(name: "Jon")

多返回值的函数:
函数可以同时返回多个返回值,多个返回值的会被组成元祖返回:

func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
        if value < currentMin {
            currentMin = value
        } else if value > currentMax {
            currentMax = value
        }
    }
    return (currentMin, currentMax)
}

上面示例代码中,返回值为元祖:(min: Int, max: Int),元祖中元素的命名分别为minmax

返回可能为空的元祖:

//返回一个可能为空的元祖,要注意区别的是,这与(Int?,Int?)是不同的,(Int,Int)?是整个元祖可能为空
func getXY(viewAdd:String) -> (x:Int,y:Int)? {
    return (142,352)
}

省略return关键字:
如果一个有返回值的函数体只有一行代码,那么可以省略return关键字:

func getXY(viewAdd:String) -> (x:Int,y:Int)? {
    (142,352)
}

函数默认参数:
跟kotlin里的一样,函数中,参数可以包含默认参数,并且带有默认值的参数放在参数列表的最后面:

func sayHello(name:String="def")->String{
    return "Hello \(name)"
}
//调用
sayHello()

可变参数:
与大多数语言一样,swift也有可变参数,格式如例子:

//可变参数
func sayHello(name:String...)->String{
    //传进来的 name 是一个数组
    return "Hello \(name)"
}
//调用
sayHello(name:"a","b","c")

输入输出参数:
因为在普通的函数中,参数都是常量,是不允许修改的,如果你想在函数中修改某个参数,并且使其生效到函数的作用域之外,那你可能需要使用到输入输出参数了。
如果还是拿java举例的话,其实就是引用类型的修改,在Java中,你给方法传递一个实例,在方法中修改了这个实例,那么方法外面这个实例也会同时被修改。在swift中想要达到这样的效果,就需要输入输出参数,使用关键字inout修饰你的参数:

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

使用的时候也有点区别:

let a:Int = 9
let b:Int = 10
swapTwoInts(&a,&b)

⚠️注意:输入输出参数不能有默认值,而且可变参数不能用 inout 标记。

调用输入输出的函数的时候,一点都不惊讶,就是跟Go中传递指针一样,在实参前面加&号,表示把这个实参的内存地址值传递过去,所以在函数中修改了这个值,函数外面的肯定也跟着变啦。也就是跟Java里的引用传递一个样

函数类型:
之前也说了,在swift里,函数也是一种类型,可以当成参数传递,也可以当成返回值,也可以声明为变量,其实语法格式都是千篇一律,Go中格式为func(int, int) int,kotlin中格式为:(Int, Int) -> Int,所以不难猜出,swift中函数类型格式:(Int, Int) -> Int,示例代码就不写了,毕竟使用方式都跟之前学过用的语言一毛一样。

【闭包】待续。。。

参考教材:Swift初见