空运算符(nil coalescing operator)(??)
------简单的说就是a有值取a,没有值取默认值b
空运算符(a??b)将可选型a进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b。这个运算符号有两个条件:
表达式a必须时optional类型
-
默认值b的类型必须要和a存储的类型要保持一致
空运算符是对以下代码的简短表达方法a != nil ? a! : b
意思是当a不为空的时候,取a!强制对a进行解封,当a为空的时候,取值b
区间运算符
------就是从a到b这个闭区间(包括a和b)上所有值
闭区间运算符(a...b)定义了一个从a到b(包括a和b的所有值的区间),b必须大于a。
var index:Int
for index in 1...5{
println("\(index)*5 = \(index*5)")
}
/**
1*5 = 5
2*5 = 10
3*5 = 15
4*5 = 20
5*5 = 25
**/
半开区间运算符号
半开区间运算符号(a..<b)定义的是从a到b但是不包括b的区间,只包含首值,不包含末尾的值
let names = ["Anna","Alex","Brian","Jack"]
let count = names.count
for i in 0..<count {
println("第\(i+1)个人叫\(names[i])")
}
//
第1个人叫Anna
第2个人叫Alex
第3个人叫Brian
第4个人叫Jack
数组是从0开始计数的,用半区间的话,数组.count的时候去的是数组的长度,但是循环是从0开始的,用闭区间的话,就会从0到4,是五个数,但是用半区间的话就是从0到3,正好是4个数对应数组的长度。
protocol
暂时我的感觉protocol在swift中的作用相当于java中的接口,规定了有哪些属性和方法,但是不说必要的实现
下面是一条样例:
我们规定了一个协议Fullname,这个协议中有一个可读的属性fullname,我们的starship遵守Fullname协议,所以他必须要有fullname属性,下面实例化Starship时候,传入name和prefix。
先实例化,实例化的时候运行了初始化的函数,赋值了name和prefix属性。fullname根据我们赋值的name和prefix来定。n123的fullname为“ yaqi”,n1234的fullname为“jiang yaqi”
protocol FullName {
var fullname:String { get }
}//表示该属性是可读的
class Starship:FullName {
var prefix:String?
var name:String
init(name:String,prefix:String? = nil){
self.name = name
self.prefix = prefix
}
var fullname:String{
return (prefix != nil ? prefix! + " " : " ")+name
}//如果prefix不为空那个fullname取值“prefix空格+name”,如果prefix没有值取值“空格+name”
}
var n123 = Starship(name:"yaqi")
n123.fullname
var n1234 = Starship(name:"yaqi",prefix:"jiang")
n1234.fullname
下面是一个遵守协议的类的例子:
protocol RandomNumberGenerator{
func random() ->Double
}//协议规定了方法,当类要遵守协议的时候就要包涵该方法。只是规定了方法的方法名字,还有返回的数据类型,具体实现,没有规定
class LinerCongruentialGenerator:RandomNumberGenerator {
var lastRandom = 42.0
let m = 139968.0
let a = 3877.0
let c = 29573.0
func random() ->Double{
lastRandom = ((lastRandom * a + c)%m)
return lastRandom / m
}
}//该实现类遵守了该协议,包含了协议中规定的方法。
let generator = LinerCongruentialGenerator()//实例化一个实现类
print("Here's a random number:\(generator.random())")//调用类中的函数random()
print("And another one:\(generator.random())")