Swift Tips_Primer-2:字符串,可选型,Array,Dictionary,Set,函数,闭包

  • String类的方法并不如NSString 丰富,所以为了方便,经常要把String 转成NSString ,使用NSString提供的方法方便的处理字符串
let str3 = "   ---Hello, Swift!   " as NSString
str3.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: " -"))
  • 在swift中,没有用nil表示,没有就是没有,不是0也不是其他东西,是一种特殊的类型,所以才有了 可选型,表示可以在类型和nil之间选择,虽然可以把一个可选型声明成let,但是一般都声明成var
var errorCode:Int? = 404
errorCode = nil
  • 可选型的三种解包方式
    • 强制解包,使用"!"
    • 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

  • 可选型,看代码,下面的三种语法结果完全一致
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"
  • 隐式可选型存在的意义:暂时存放一个nil,等用户真正使用的时候给赋值确保不是nil可以直接使用

  • swift 数组的声明

var emptyArray1:[Int] = []
var emptyArray2:Array<Int> = []
var emptyArray3 = [Int]()
var emptyArray4 = Array<Int>()
//5个0元素的数组
var allZeros = [Int](count: 5, repeatedValue: 0)
  • 遍历一个Array ,既要获取到元素又想获取到下标,可以使用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方法会返回老的值,方便做一些逻辑处理,而使用索引操作不会返回
if let removedWeek = dict.removeValueForKey("1"){
    print("\(removedWeek) 删除成功")
}
  • Set 提供了很多Array没有的方法,可以很方便的处理集合的交集,并集,子集,真子集,超集,真超集,减法等,效率远高于用NSArray处理
  • 一个函数
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)")
}
  • 不想定义函数的外部参数名的时候,可以用"_"省略,看代码
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")
  • 带有默认值的参数的函数,调用的时候参数的顺序是随意的,不是固定的
func sayHelloTo( name:String, with greeting:String = "Hello") ->String{
    return "\(name),\(greeting)"
}
  • 变长参数
func sayHelloTo2(content greeting:String,names:String ...) -> Void{
    for name in names{
        print( "\(name),\(greeting)")
    }
}
sayHelloTo2(content: "Hello", names: "A","B","C","D")
  • 可变参数--值传递:函数的参数默认是“let”,需要显式的声明为"var"
func toBinary(var num:Int) -> String{
    var res = " "
    repeat{
        res = String(num%2) + res
        num /= 2
    }while num != 0
    return res
}
  • 可变参数--地址传递(引用传递),使用inout关键字,包括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)
  • 函数变量
func add(a:Int,b:Int) ->Int{
    return a+b
}
let anotherAdd:(Int,Int)->Int = add;
anotherAdd(3,4)
  • 函数变量的用法
var arr:Array<Int> = []
for _ in 0..<1000{
    arr.append(random()%1000)
}
//系统默认升序
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)
  • 从一个高阶函数到函数式编程的代表: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: +)
  • 函数作为返回值和函数的嵌套
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
}
  • 闭包:本质上是函数
var arr:Array<Int> = []
for _ in 0..<1000{
    arr.append(random()%1000)
}
arr.sort({ (a:Int,b:Int) ->Bool in
    return a > b
})
//语法简化
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,如果闭包是最后一个参数,可以把闭包提到外面
arr.sort(){ a , b in
    return a > b
}
//没有其他参数,小括号可以省略
arr.sort{ a , b in
    return a > b
}
//闭包练习:转为二进制字符串
arr.map{(var number) -> String in
    var res = ""
    repeat{
        res = String(number % 2) + res
        number /= 2
    }while number != 0
    return res
}
  • 闭包和函数属于引用类型
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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容