简述
自从苹果2014年发布Swift,到现在已经两年多了,而Swift也来到了3.1的版本。最近利用工作之余,整理了一份简单的入门教程。
1.首先,作为一个程序员,大家第一想到的是“Hello,World”,下面阐述OC和Swift中分别是怎样实现展示“Hello,World”。
OC:NSLog(@"Hello,World");
Swift: print("Hello,World")
通过上面两个,我们就能清楚的知道,在Swift中,这行代码就是一个完整的程序,我们不需要为了输入输出或者字符串处理导入一个单独的库,全局作用域中的代码会被自动当做程序的入口点,不需要main函数,也不需要在每个语句结尾写上分号。
在这里顺便插入一个Xcode的Playground,这是一个简单易用的代码预览功能,在左侧输入代码,右边立马能展示效果。
简单值 let 和var
使用let申明常量,var申明变量,常量我们只能为它赋值一次,编译的时候我们并不需要获取,可以使用多次,但是不能再次被赋值。变量是在程序运行过程中,多次被赋值的量。
let myPlaygrounWidth = 20
var myChangeWidth = 30
myChangeWidth = 40
常量或者变量的类型必须和你给它们的值保持一致,但是,你可以不用明确地声明类型,如果在声明的同时赋值的话,编译器会自动推断类型。例如如下语句:
var age = 10
let string = "myString"
根据所赋的值,编译器会自动推断age为整型,string为字符串(String)类型,但是你也可以显式指定类型:
let myString:NSString = "This is String"
但是值永远不会隐式转换其他类型,如果你需要一个值转换成其他类型,必须显式转换。
let testView = "The Height is"
let height = 80
let testViewHeight = testView + String(height)
当你取消那个String时候就会报错:不会隐式转换其他类型
let testViewHeight2 = testView + height
当然有一个更方便的转换字符串的方法:右斜杠(值)
let testViewHeight3 = "testView + \(height)"
数组和字典
数组
数组在一个有序链表存储了多个类型相同的值,同一个值可以在数组的不同位置多次出现。Swift的数组对它们能存储的值的类型是明确的,不同于OC中NSArray和NSMutableArray,OC数组能存储任何类型的对象,并且不提供关于这些对象自身的任何信息,在Swift中,任何一个特定的数组所存储的值,类型总会被确定下来,要么显式说明,或者通过类型推断。如果你创建了一个Int类型数组,你就不能存储任何非Int类型的值插入数组。
1.数组的创建
var gameStringArray = ["one","two","three"]
var gameShowArray:[String] = ["stringOne","stringTwo","stringThree"]
var gameArray = ["one","two","three",1](会报错)
var gameInteArray:[Int] = [1,2,"string"](会报错)
因为当你显式的决定了数组的值的类型就不能再插入其他非这指定类型的值,但是当并非显式决定时候可以后面添加as[Any]泛指各种类型,如下所示:
var gameArray = ["one","two","three",1] as [Any]
2.数组的存取和修改
数组的取值还是和OC差不多,可以通过索引取值
gameStringArray[1] gameStringArray[2]
当你数组越界时候会提示报错如下所示:
数组的简单add、insert、remove和OC差不多,只是语法的不同,如下所示:
var gameStringArray = ["one","two","three"] //["one", "two", "three"]
gameStringArray.append("addString") //["one", "two", "three", "addString"]
gameStringArray.insert("insertString", at: 1) //["one", "insertString", "two", "three", "addString
gameStringArray.remove(at: 2) //"two"
print(gameStringArray) // "["one", "insertString", "three", "addString"]\n"
你也可以一次性修改指定范围的值,即使将要替换掉的元素的数量和将要替换成的元素的数量不一样,也都可以正确使用,如下所示:
gameStringArray[1...3] = ["changeString","ChangeString2"] //"["one", "changeString", "ChangeString2"]\n"
字典(Dictionary)
字典是一种存储多个类型相同的值的容器,每个值都和一个唯一的Key(键)相对应,这个key在字典中就是其对应值的唯一标识,和数组不同,字典里的元素没有顺序。Swift的字典对它们能存放的键和值的类型是明确的。这不同于Objective-C的NSDictionary类和NSMutableDictionary类,Objective-C的字典能存储任何类型的对象作为键或值,并且不提供关于这些对象自身的任何信息。在Swift里,任何一个特定的字典键和值,其类型总会被确定下来,或者通过显式的类型说明,或者通过类型推断
1.字典的初始化
var dictionary = ["Ch":"China","DB":"Dublin"]
var showDic:Dictionary<String,String> = ["Ch":"China","DB":"Dublin","test":"\(1)"] //假如直接写1会报错,显式决定了类型
2.字典的存取和修改
dictionary["Ch"] //"China" 如果字典有就是取值
dictionary["Ch"] = "Chinese" //修改value
print(dictionary) //"["DB": "Dublin", "Ch": "Chinese"]\n"
dictionary.updateValue("Ch", forKey: "Updata") //拥有key就是修改 没有就相当于添加
dictionary.removeValue(forKey: "Ch") //移除 当字典中没有这个key时候为nil 但是在OC中会报错闪退
数组和字典的可变性
数组和字典都把多个值存放在一个集合里。如果你创建了一个数组或者字典,并且将之指定为变量,那么该集合就是可变的,这意味着在集合被创建后,可以通过增加或删除元素来改变集合的容量大小。相反地,如果你指定一个数组或字典为常量,那么该数组或字典就是不可变的,其容量大小不能被改变。
对字典来说,不可变还意味着你不能改变字典里某个键的值。一个不可变的字典一旦被设置值后,它里面的内容就不能再改变。
但是,数组的不可变性跟字典略有不同。尽管你不能进行任何可能会改变数组大小的操作,但是你可以给数组中的某个索引设置一个新的值。这使得Swift的数组在大小固定的情况下能够达到最佳的性能。
控制流
使用if和switch来进行条件操作,使用for-in、for、while和do-while来进行循环
1.for循环 在相对OC来说 Swift的功能强大,慢慢弃用了C语言的
for (<#initialization#>; <#condition#>; <#increment#>) { <#statements#> }
Swift For循环如下所示:
var nameArray = ["张三","李四","王五","赵六"]
for string in nameArray {
print(string)
}
for index in 1..<10 {
print(index)
// 打印结果为1-9
}
for index in 1...10 {
print(index)
//打印结果为1-10
}
for index in nameArray.reversed() {
print(index)
//打印结果相反 倒序
}
for (index,i) in nameArray.enumerated() {
print(index) //遍历索引
print(i) //遍历元素
}
2.if else
在if语句中,条件必须是一个布尔表达式——这意味着像if score { ... }这样的代码将报错,而不会隐形地与 0 做对比。
你可以一起使用if和let来处理值缺失的情况。这些值可由可选值来代表。一个可选的值是一个具体的值或者是nil以表示值缺失。在类型后面加一个问号来标记这个变量的值是可选的。具体写法和OC差不多,少了条件的括号
var score = 50
if score > 20{
}else
{
score += 1
}
3.while
var x = 2
while x < 10 {
x = x + 2
}
var m = 2
repeat { //do 改成了repeat
m = m * 2
} while m < 10
函数和闭包
//定义一个传入两个String返回为String的函数
func test(name:String,eat:String) ->String{
return "Today\(name)eat \(eat)"
}
//函数调用
test(name: "张三", eat: "ice")
//定义一个传入key 和value 返回一个字典的函数
func redictionary(key:String,value:String) -> Dictionary<String,String>
{
var dic = [String:String]()
dic[key] = value
return dic
}
//函数调用
print(redictionary(key: "myName", value: "Hou"))
var myDic:Dictionary<String,String> = redictionary(key: "myTest", value: "Test")
//函数的参数是可变的,可以不传,也可以多个(求平均数)
func getAverage(numbers:Int...) -> Float
{
var sum = 0
let count = numbers.count
for number in numbers {
sum += number
}
let result = sum / count
return Float(result)
}
print(getAverage(numbers: 12,22,33))