1.常量与变量
let name = "小明"//定义一个名字叫小明的常量
var hisAge = 8//使用var关键字来定义一个hisAge的变量
swift是不用后面加 ; 的,与oc不同,定义的时候也可以不指定类型(当然也可以指定类型,具体实现稍后再写)。swift并不是不是一门强类型的语言,而是依附着强大的类型推测功能。
//这个是标注类型的
var name :String = "小明"
2.注释
//单行注释格式
/*
块注释格式
*/
3.输出print
print("那是小明!")
print("1","2","3")```
###### 上面两个会输出 我是小明! ,还有 1,2,3
```swift
print(items: Any..., separator: String, terminator: String)
上面这个是一个重载的print方法,可以对items里的参数指定分隔符和终止符,比如:
print("a","b","c",separator:"*",terminator:"end")```
###### 打印结果是a\*b\*cend 。
```swift
let name = "小明"
print("那是\(name)")
打印结果是 那是小明。
4.基本数据类型
元组类型
元组是Swift中一个非常好用的数据类型,它可以把多个值的成员复合成一个值,这些成员的数据类型可以不同。格式是把成员值放到一个括号里,以括号分隔。
let message = {"小明",9,"三年二班"}
也可以这样写,给每个成员变量命名:
let message = {name:"小明",age:9,grade:"三年二班"}
let showName = message.name
let showAge = message.age
let showGrade = message.grade
当我们只需要其中一个或两个值得时候这样赋值,只保留第二项,其他都省略:
let message = (name :"小明",age :9,grade:"三年二班")
let (_,showAge,_) = message
print("Name is \(showAge)")
5.可选型
var age :Int?
age = Int("12")//结果age = 12
age = Int("小明")//age = nil
这个例子告诉我们可选性如果没有值则返回一个nil的值,否则返回一个Int的值。
6.运算符
?? 运算符:它的之前是可选型,之后为非可选型。“??”操作符自带解包功能,在赋值时“??”会检查其之前的可选型;如果可选型不为nil则返回可选型的值;如果其值为nil,则不会返回nil而去返回“??”之后的非可选型的值。
7.数值运算
- 三元运算符
判断条件?为真时的操作:为假时的操作。
var 身高 =180
var 名字 = 身高<160 ?"小明":"小刚"
//结果为小刚
- 范围
在oc中我们使用的是range来指示一个起始位置和长度,而Swift中更加方便一些。 - 1...5表示闭区间[1,5],也就是从1到5的范围。
- 1..<5表示半闭区间[1,5),也就是从1到4。
8.字符串
- 想要获得String中某个字素的时候。
var str = "Hello"
str[str.index(str.startIndex, offsetBy:3)]
//下标取值并不能保证安全,所以有了下面的这个方法
str[str.index(str.startIndex,offsetBy:6,limitedBy:str.endIndex)!]//如果指定的下标越界就会立刻抛出错误
- 截取字符串
var str = "hello"
let start = str.index(str.startIndex, offsetBy:1)
let end = str.index(str.startIndex, offsetBy:3)
str(start...end)
- String与NSString之间的传值需要遵循严格的类型转化:
var s1:NSString = "NSStr"
var s2:String =String(s1)
var s3:String = "Str"
var s4:NSString = s3 as NSString//转类型
- Swift3.0 返回可选类型的范围,我们用这个方法获得浮点数的整数部分:
let num = "123.45"
let deRange = num.range(of:".")//该方法返回的是可选型
let wholeNumber = num[num.startIndex .. < deRange!.lowerBound]
- 替换或删除字符串的某部分:
var str = "Hello"
let start = str.index(str.startIndex,offsetBy:1)
let end = str.index(str.startIndex,offsetBy:3)
str.removeSubrange(start...end)//结果是Ho
- 删除字符串里的单个字素
var str ="Hello"
let start = str.index(str.startIndex,offsetBy:1)
str.remove(at:start)
print(str)
- 替换字符串
var str = "Hello"
let start = str.index(str.startIndex,offsetBy:1)
let end = str.index(str.startIndex, offsetBy:3)
str.replaceSubrange(start...end,with:"new")//结果是Hnewo
9.集合类型
- 数组
创建一个数组的实例:
第一种方式:
var a = Array()//得到一个字符串类型的空数组
这是一种泛型结构体式的初始化方法。
第二种初始化方法:
var a = [String]()
官方比较推荐第二种方式。
- 数组添加元素的时候,只要数组类型相同,就可以把一个数组中的元素加入到另一个数组中。
1.exampleOfArray +=["AD钙奶"]
2.exampleOfArray.append("AD钙奶")
- 替换数组中的元素
1.var arrayItem = exampleOfArray[0]
exampleOfArray[1] ="软炸里脊"
- 还可以使用范围来获取或者替换数组中的多个元素,替换的元素和原有的元素个数可以不同:
exampleOfArray[1...2] = ["AD钙奶"]
如果想把新元素插入到指定位置,则可以使用方法insert:
exampleOfArray.insert("AD钙奶",at:3)
删除数组最后的一个元素:
exampleOfArray.removeLast()
//删除指定位置的元素:
exampleOfArray.remove(at :0)
- 集合
集合和数组非常相似,区别是集合中不会有重复的元素,并且集合中的成员是无序的。
//数组转化成集合
var exampleOfArray = ["糖醋里脊","宫保鸡丁","水煮鱼","鱼香肉丝","大盘鸡","大盘鸡"]
var exampleOfSet = Set(exampleOfArray)
把变量声明为集合
//即使里面有重复的元素,声明完成后也不会有重复的了
var exampleOfSet:Set =["糖醋里脊","宫保鸡丁","水煮鱼","鱼香肉丝","大盘鸡","大盘鸡"]
添加和删除元素方法:
exampleOfSet.insert("AD钙奶")//新增一个元素
exampleOfSet.remove("AD钙奶")//删除一个元素,如果集合里没有该元素,则返回nil
- 字典
字典的创建:
var exampleOfDictionary =Dictionary()
等同于:
var exampleOfDictionary = [String:Int]()
添加新值,用updateValue方法会返回修改前的值;如果修改前的值不存在于字典中,则会新增这个键值对,同时返回nil。
var exampleOfDictionary = ["年龄":25,"身高":175]
let oldValue = exampleOfDictionary.updateValue(20, forKey:"年龄")
当要移除键值时只需要把这个值赋nil就可以了。
10.控制流
- while循环:分为先执行代码再判断条件的repeat-while循环结构,还有先判断条件再执行循环的while循环。
var index1 =5
var index2 =5
while index1 >5{
//不符合循环条件
index1 -=1
print(index1)//不会执行
}
repeat{
index2 -=1
print(index2)//输出4
}while index2 >5//不符合循环条件,跳出循环。
- guard判断语句
guard-else是先处理不符合guard中判断条件的情况,最后处理条件为真的操作。每个guard-else体都不会fall through(即某个case执行完毕后不会自动执行下一个case),所以我们需要使用return和break。 - switch
Swift中case里面不用加break。
11.反射
1.反射(Reflection)
对于C#、Java开发人员来说,肯定都对反射这个概念相当熟悉。反射就是可以动态获取类型、成员信息,同时在运行时(而非编译时)可以动态调用任意方法、属性等行为的特性。
Swift的反射机制是基于一个叫Mirror的struct来实现的,其内部有如下属性和方法:
let children:Children//对象的子节点
displayStyle:Mirror.DisplayStyle?//对象的展示风格
let subjectType: Any.Type//对象的类型
func superclassMirror() -> Mirror?//对象父类的mirror
12.?? 空合运算符
1.x ?? y ,判断x是否为nil,如果为nil则取y的值,否则则把x解包并返回。
13.public func truncatingRemainder(dividingBy other: Self) -> Self
1.对浮点数进行取余
14.元组(基本数据类型)
1.元组是一个非常好用的数据类型,它可以把多个值成员复合成一个值,并且这些成员的数据类型可以不同;把成员值放到一个括号中,以逗号分隔。