- String類的方法并不如NSString 豐富,所以為了方便,經(jīng)常要把String 轉(zhuǎn)成NSString ,使用NSString提供的方法方便的處理字符串
let str3 = " ---Hello, Swift! " as NSString
str3.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: " -"))
- 在swift中,沒有用nil表示,沒有就是沒有,不是0也不是其他東西,是一種特殊的類型,所以才有了
可選型
,表示可以在類型和nil之間選擇,雖然可以把一個(gè)可選型聲明成let,但是一般都聲明成var
var errorCode:Int? = 404
errorCode = nil
- 可選型的三種解包方式
- 強(qiáng)制解包,使用"!"
- if let 解包
- 嘗試解包,使用"?"
var errorCode:String? = "404"
//1.
if errorCode != nil {
"The error code is " + errorCode!
}else{
"Not error"
}
//2.
if let errorCode = errorCode{
"The error code is " + errorCode
}
//3.
errorCode?.uppercaseString
- 可選型,看代碼,下面的三種語法結(jié)果完全一致
var errorMsg:String? = "Not Found"
let message:String
if let errorMsg = errorMsg{
message = errorMsg;
}else{
message = "No Error"
}
let message2 = errorMsg == nil ? "No Error" : errorMsg
let message3 = errorMsg ?? "No Error"
隱式可選型存在的意義:暫時(shí)存放一個(gè)nil,等用戶真正使用的時(shí)候給賦值確保不是nil可以直接使用
swift 數(shù)組的聲明
var emptyArray1:[Int] = []
var emptyArray2:Array<Int> = []
var emptyArray3 = [Int]()
var emptyArray4 = Array<Int>()
//5個(gè)0元素的數(shù)組
var allZeros = [Int](count: 5, repeatedValue: 0)
- 遍歷一個(gè)Array ,既要獲取到元素又想獲取到下標(biāo),可以使用enumerate
for (index,number) in numbers.enumerate(){
print(index,number)
}
- Array 的操作,看代碼
var array:[String] = ["A","B","C","D","E"]
//增
array.append("F")
array += ["G"]
array += ["H","I"]
array.insert("K", atIndex: 2)
//刪
array.removeFirst()
array.removeLast()
array.removeAtIndex(2)
array.removeRange(0..<2)
//改
array[0] = "A"
array[1...3] = ["T","Y","Z"]
array[1..<3] = ["X"]
- Dictionary 的聲明
var dict:Dictionary<String,String> = ["1":"星期一","2":"星期二","3":"星期三","4":"星期四","5":"星期五","6":"星期六","7":"星期日"]
var emptyDict1:[String:Int] = [:]
var emptyDict2:Dictionary <Int,String> = [:]
var emptyDict3 = [String:String]()
var emptyDict4 = Dictionary<Int,Int>()
- Dictionary 遍歷
Array(dict.keys)
Array(dict.values)
for key in dict.keys{
print(key)
}
for value in dict.values{
print(value)
}
for (key,value) in dict{
print("\(key):\(value)")
}
- Dictionary 增刪改,注意,updateValue 方法和 removeValueForKey方法會(huì)返回老的值,方便做一些邏輯處理,而使用索引操作不會(huì)返回
if let removedWeek = dict.removeValueForKey("1"){
print("\(removedWeek) 刪除成功")
}
- Set 提供了很多Array沒有的方法,可以很方便的處理集合的交集,并集,子集,真子集,超集,真超集,減法等,效率遠(yuǎn)高于用NSArray處理
- 一個(gè)函數(shù)
func findMinAndMax( numbers:[Int]) -> (max:Int,min:Int)?{
guard numbers.count > 0 else{
return nil
}
var minValue = numbers[0]
var maxValue = numbers[0]
for number in numbers{
minValue = minValue < number ? minValue : number
maxValue = maxValue > number ? maxValue : number
}
return (maxValue,minValue)
}
var scores : [Int]? = [12,12,13,14,15,43]
scores = scores ?? []
if let result = findMinAndMax(scores!){
print("maxValue = \(result.max),minValue = \(result.min)")
}
- 不想定義函數(shù)的外部參數(shù)名的時(shí)候,可以用"_"省略,看代碼
func sayHelloTo( name:String, with greeting:String) ->String{
return "\(name),\(greeting)"
}
sayHelloTo("lindong",with:"Hello")
func sayHelloTo2(name:String,_ greeting:String) ->String{
return "\(name),\(greeting)"
}
sayHelloTo2("lindong", "Hello")
- 帶有默認(rèn)值的參數(shù)的函數(shù),調(diào)用的時(shí)候參數(shù)的順序是隨意的,不是固定的
func sayHelloTo( name:String, with greeting:String = "Hello") ->String{
return "\(name),\(greeting)"
}
- 變長(zhǎng)參數(shù)
func sayHelloTo2(content greeting:String,names:String ...) -> Void{
for name in names{
print( "\(name),\(greeting)")
}
}
sayHelloTo2(content: "Hello", names: "A","B","C","D")
- 可變參數(shù)--值傳遞:函數(shù)的參數(shù)默認(rèn)是“l(fā)et”,需要顯式的聲明為"var"
func toBinary(var num:Int) -> String{
var res = " "
repeat{
res = String(num%2) + res
num /= 2
}while num != 0
return res
}
- 可變參數(shù)--地址傳遞(引用傳遞),使用inout關(guān)鍵字,包括Array,Dictionary,Set 等
func swapTwoInts(inout a:Int,inout _ b:Int) {
(a,b) = (b,a)
}
var a:Int = 12
var b:Int = 13
swapTwoInts(&a, &b)
- 函數(shù)變量
func add(a:Int,b:Int) ->Int{
return a+b
}
let anotherAdd:(Int,Int)->Int = add;
anotherAdd(3,4)
- 函數(shù)變量的用法
var arr:Array<Int> = []
for _ in 0..<1000{
arr.append(random()%1000)
}
//系統(tǒng)默認(rèn)升序
arr.sort()
//降序
func descendSort(a:Int, _ b:Int)->Bool{
return a > b
}
arr.sort(descendSort)
//按字母表順序
func cmpByNumberString(a:Int, _ b:Int)->Bool{
return String(a) > String(b)
}
arr.sort(cmpByNumberString)
//按離500最近排序
func near500(a:Int, _ b:Int) -> Bool{
return abs(a - 500) < abs(b - 500) ? true : false
}
arr.sort(near500)
- 從一個(gè)高階函數(shù)到函數(shù)式編程的代表:map,filter,reduce
var scores2 = [92,65,66,24,87,75,45]
func changeScores(inout scores:[Int], by changeScore:(Int) -> Int){
for (index,score) in scores.enumerate(){
scores[index] = changeScore(score)
}
}
func changeScore(score:Int) -> Int{
return Int(sqrt(Double(score) * 10))
}
//changeScores(&scores2, by: changeScore)
//map
scores2.map(changeScore)
//filter
func fail(score:Int) -> Bool{
return score < 60
}
scores2.filter(fail)
//reduce
func add(num1:Int,num2:Int) -> Int{
return num1 + num2
}
scores2.reduce(0, combine: add)
scores2.reduce(0, combine: +)
- 函數(shù)作為返回值和函數(shù)的嵌套
func step1MailFeeByWeight(weight:Int) ->Int{
return 1 * weight
}
func step2MailFeeByWeight(weight:Int)->Int{
return 3 * weight
}
func totalPrice(price:Int,weight:Int) ->Int{
func chooseMailFeeByWieght(weight:Int)-> (Int) ->Int{
return weight <= 10 ? step1MailFeeByWeight : step2MailFeeByWeight
}
let mailFee = chooseMailFeeByWieght(weight)
return mailFee(weight) + price * weight
}
- 閉包:本質(zhì)上是函數(shù)
var arr:Array<Int> = []
for _ in 0..<1000{
arr.append(random()%1000)
}
arr.sort({ (a:Int,b:Int) ->Bool in
return a > b
})
//語法簡(jiǎn)化
arr.sort({ (a:Int,b:Int) ->Bool in return a > b })
arr.sort({a,b in return a > b})
arr.sort({a,b in a > b})
arr.sort({$0 > $1})
arr.sort(>)
//Trailing Closure,如果閉包是最后一個(gè)參數(shù),可以把閉包提到外面
arr.sort(){ a , b in
return a > b
}
//沒有其他參數(shù),小括號(hào)可以省略
arr.sort{ a , b in
return a > b
}
//閉包練習(xí):轉(zhuǎn)為二進(jìn)制字符串
arr.map{(var number) -> String in
var res = ""
repeat{
res = String(number % 2) + res
number /= 2
}while number != 0
return res
}
- 閉包和函數(shù)屬于引用類型
func runningMetersPreDay(mPerDay:Int) -> ()->Int{
var totalMeters = 0
return {
totalMeters += mPerDay
return totalMeters
}
}
var planA = runningMetersPreDay(1000)
planA()
planA()
var planB = runningMetersPreDay(2000)
planB()
planB()
var anotherPlan = planB
anotherPlan()
planB()