Swift小贴士

//1.强制类型转换的括号括表达式而不括类型

let r = 2

let pi = 3.14159

//let area = pi * r * r  //这个是会报错的,因为类型推断无效

let area = Double (pi * r * r ) //强制类型转换的括号括表达式而不括类型
//2.等于号不能返回值

let x = 2

if x = 2 {

//报错。因为swift的等于号表达式没有返回值,这也是防止了== 误写成 =

}
//3.加法做字符串拼接符,不支持数字自动转字符串

let dog:Character = "dog"

let cow:Character = "cow"

let dogCow = dog + cow//="dogcow"

let num = 5

//let combine = dog + num // 报错

let combine = dog + String(num)
//4. Optional类型:可以有值或者不存在(=nil)。

let possibleNumber = "123"

let convertedNumber = possibleNumber.toInt()   //这个变量的类型推断结果是 Int? 或者读作optional Int



//用if来判断optional是否有值

if convertedNumber{

    println("\(possibleNumber) has an Integer value of \(convertedNumber!)")//变量名后面的感叹号表示知道这个Optional变量/常量此时有值,如果错了会出runtime error

}else{

    println(("\possibleNumber") could not be converted to an integer)

}



//一边赋值一边判断,这里等价于先给actualNumber赋值,再判断他是否存在。

//这里的actualNumber必须是Optional的变量/常量。

if let actualNumber = possibleNumber.toInt(){

    println("\(possibleNumber) has an Integer value of \(actualNumber!)")

}

else{

    println(("\possibleNumber") could not be converted to an integer)

}



//optional变量的初始化

var serverResponseCode:Int? = 404 //值为404

serverResponseCode = nil  //空值



var surveyAnswer:String?//自动nil



//optinoal的,加问号。

let possibleString: String? = "An optional string"

println(possibleString!)



//optinoal的,而且第一次赋值之后知道这个变量/常量会一直保持有值的状态,就在声明时加感叹号,
//这样用的时候就不需要加感叹号了。
let assumedString: String! = "An implicitly unwrapped optional string." println(assumedString) if assumedString { println(assumedString) } //一边赋值一边判断是否为nil if let definiteString = assumedString { println(definiteString) }
//5.元组tuple

let http404Error = (404,"Not Found")

let (statusCode,StatusMessage)= http404Error

println("The status code is \(statusCode)")

println("The status message is \(statusMessage)")



let (justTheStatusCode,_) = http404Error

println("The status code is \(justTheStatusCode)")



println("The status code is \(http404Error.0)")

println("The status message is \(http404Error.1)")



//tuple里的别名

let http200Status = (statusCode: 200, description: "OK")

println("The status code is \(http200Status.statusCode)")

println("The status message is\(http200Status.description)")
//6.Range

//1到5,包括1也包括5

for index in 1...5{

    println ("\(index) times 5 is \(index * 5)")

}



let names = ["Anna","Alex.","Brian","Jack"]

let count = names.count

//0到count,包括0不包括count,所以其实是0到count-1

for i in 0..count{

    println("Person \(i+1)" is called \(names[i]))

}
//7.字符串数组和普通数组

var shoppingList:String[]=["Eggs","Milk"] //var所以可以再加元素,let就不行了

var shoppingList = ["Eggs","Milk"] //因为类型推断,一个array必须包含同类元素,所以能推断出来是string类

println("The shopping list contains \(shoppingList.count) items.")



if shoppingList.isEmpty{

    println("The shopping list is empty.")

} else {

    println("The shopping list is not empty.")

}



shoppingList.append("Flour")

shoppingList += "Baking Powder"

shoppingList += ["Chocolate Spread","Cheese","Butter"]

shoppingList[0] = "Six eggs"

shoppingList[4...6]=["Bananas","Apples"] //4...6有3个元素,所以3个元素被换成了2个。不能越界哦。

shoppingList.insert("Maple Syrup",atIndex:0)



let mapleSyrup = shoppingList.removeAtIndex(0)//删除并放到mapSyrup里,而且所有元素都往前移了一格

firstItem = shoppingList[0]



let apples = shoppingList.removeLast()//删除并赋值,减少了array长度



for item in shoppingList{  //遍历

    println(item)

}



//enumerate方法让他变成可以以key value形式遍历

for (index,value) in enumerate(shoppingList){

    println("Item \(index + 1):\(value)")

}

    //Item 1:Six eggs

    //Item 2:Milk

    //...





var someInts = Int[]()   //创建一个空的

var someInts:Int[] = [1,2,3] //创建并初始化

var someInts = [1,2,3] //创建并初始化并由于类型推断而省略了类型声明

someInts.append(3)//插入

someInts = []//清空
//8.字典

//普通声明和初始化

var airports:Dictionary<String,String> = ["TYO":"Tokyo","DUB":"Dublin"]

//类型推断下的声明和初始化

var airports = ["TYO":"Tokyo","DUB":"Dublin"]

println("The dictionary of airports contains \(airports.count) items.")

//更新一个key对应的value,用直接赋值

airports["LHR"] = "London"

airports["LHR"] = "London Heathrow"



//更新一个key对应的value,用Dictionary带的方法

if let oldValue = aiports.updateValue("Dublin International", forKey:"DUB"){

    println("The old value for DUB was \(oldValue).")

}

//取值取出来是optional的

if let airportName = airports["DUB"]{

    println("The name of the airport is \(airportName).")

} else {

    println("That airport is not in the airports dictionary")

}



//用下标从字典里删元素

airports["APL"] = "Apple International"

airports["APL"] = nil 



//用方法从字典里删元素

if let removedValue = airports.removeValueForKey("DUB"){

    println("The removed airport's name is \(removedValue).")

} else {

    println("The airports dictionary does not contain a value for DUB.")

}





for(airportCode, airportName) in airports{

    println("\(airportCode):\(airportName)")

}



for airportCode in airports.keys{

    println("Airport code:\(airportCode)")

}



for airportName in airports.values{

    println("Airport name:\(airportName)")

}



let airportCodes = Arrary(airports.keys)

let airportNames = Arrary(airports.values)



//dictionary里元素没有顺序,所以遍历时顺序不确定和插入时顺序一致



var namesOfIntegers = Dictionary<Int,String>()//初始化一个空字典

namesOfIntegers[16]="sixteen"//可以类型推断出来

namesOfIntegers = [:]//再次置为空值,但类型不变





//let的immutable的dictionary不能改变key,一旦设定value后也不能改变key的对应value。arrary则可以改变value。都不能增加长度

//如果长度固定,尽量用let
//9.蛇梯棋和while循环,do-while循环



let finalSquare = 25

var board = Int[](count: finalSquare + 1,repeatedValue:0)



board[03]=+08;board[06]=+11;board[09]=+09;board[10]=+02

board[14]=-10;board[19]=-11;board[22]=-02;board[24]=-08



var square = 0

var diceRoll = 0

while square < finalSquare{

    //roll the dice

    if ++diceRoll==7{diceRoll = 1}

    //move by the rolled amount

    square += diceRoll

    if square < board.count{

        square +=board[square]

    }

    

}



println("Game over!")





do{

square += board[square]



if ++diceRoll == 7 {diceRoll = 1}



square += diceRoll

} while square < finalSquare

println("Game over!")

 

//10.下划线断数字。意义不变。

let count = 3_000_000_000_000

 

 

 

 

let orangesAreOrange = true//自动推断为bool

let turnipsAreDelicious = false



if turnipAreDelicious{

    println("Mmm,tasty turnips!")

} else {

    println("Eww, turnips are horrible.")

}



let i = 1

if i{

//if语句不能用非bool值

}



if i==1{

//这样就可以

}



//5.元组tuple

let http404Error = (404,"Not Found")

let (statusCode,StatusMessage)= http404Error

println("The status code is \(statusCode)")

println("The status message is \(statusMessage)")



let (justTheStatusCode,_) = http404Error

println("The status code is \(justTheStatusCode)")



println("The status code is \(http404Error.0)")

println("The status message is \(http404Error.1)")



//tuple里的别名

let http200Status = (statusCode: 200, description: "OK")

println("The status code is \(http200Status.statusCode)")

println("The status message is\(http200Status.description)")





//Optional:有值或者不存在。这个地方看起来,java里很多的nullPointerException在swfit里可以避免了。

//也就是说我不用try catch

let possibleNumber = "123"

let convertedNumber = possibleNumber.toInt()   //这个变量的类型推断结果是 Int? 或者optional Int



//用if来判断optional是否有值

if convertedNumber{

    println("\(possibleNumber) has an Integer value of \(convertedNumber!)")

}else{

    println(("\possibleNumber") could not be converted to an integer)

}





if let actualNumber = possibleNumber.toInt(){

    println("\(possibleNumber) has an Integer value of \(actualNumber!)")

}

else{

    println(("\possibleNumber") could not be converted to an integer)

}



//optional变量的初始化

var serverResponseCode:Int? = 404 //值为404

serverResponseCode = nil  //空值



var surveyAnswer:String?//自动nil



let possibleString: String? = "An optional string"

println(possibleString!)



let assumedString: String! = "An implicitly unwrapped optional string."

println(assumedString)



if assumedString{

    println(assumedString)

}



if let definiteString = assumedString {

    println(definiteString)

}





let age = -3

assert(age >= 0, "A person's age cannot be less than zero")



assert(age >= 0)





let b = 10

var a =5

a = b





let (x,y) = (1,2)



if x = y {

//invalid, no return value

}



1+2

5-3

2*3

10.0/2.5 //=4.0 



"hello,"+"world"

let dog:Character = "dog"

let cow:Character = "cow"

let dogCow = dog + cow//="dogcow"

let num = 5

//let combine = dog + num // 报错

let combine = dog + String(num)



9%4//=1

-9%4//=-1

8%2.5//0.5



var i = 0

++i



var a = 0

let b = ++a//a=1,b=1

let c = a++//a=2,c=1



let three = 3

let minusThree = -three

let plusThree = -minusThree



let minusSix = -6

let alsoMinusSix = +minusSix//=-6



var a = 1

a += 2



let name = "world"

if name == "world" {

    println("hello,world")

} else {

    println("I'm sorry \(name), but I don't recognize you")

}



let contentHeight = 40

let hasHeader = true

let rowHeight = contentHeight +(hasHeader ? 50 : 20)





//6.Range

//1到5,包括1也包括5

for index in 1...5{

    println ("\(index) times 5 is \(index * 5)")

}



let names = ["Anna","Alex.","Brian","Jack"]

let count = names.count

//0到count,包括0不包括count,所以其实是0到count-1

for i in 0..count{

    println("Person \(i+1)" is called \(names[i]))

}



let allowedEntry = false

if !allowedEntry{

    println("ACCESS DENIED")

}



let enteredDoorCode = true

let passedRetinaScan = false

if enteredDoorCode && passedRetinaScan{

    println("Welcome!")

} else {

    println("ACCESS DENIED")

}



if (enteredDoor && passedRetinaScan) || hasDoorKey || knowsOveridePassword{

    println("Welcome!")

} else {

    println("ACCESS DENIED")

}



let someString = "Some string literal value"



let wiseWords = "\"Imagination is more important than knowledge\" - Einstein"

let dollorSign = "\x24"

let blackHeart = "\u2665"

let sparkingHeart = "\U0001F496"



var emptyString = ""

var anotherEmptyString = String()



if emptyString.isEmpty {

    println("Nothing to see here")

}





var variableString = "Horse"

variableString += " and carriage"



let constantString = "highlander"

constantString += " and another Highlander" // compile-time error



for character in "Dog!"{

    println(character)

}





let yenSign:Character = "¥" //need the type annotation or it will be a string



let unusualMenagerie = "Koala , Snail ,Penguin ,Dromedary "

println("unusualMenagerie has \(countElements(unusualMenagerie)) characters")



let string1 = "hello"

let string2 = " there"

let character1:Character = "!"

let character2:Character = "?"



let stringPlusCharacter = string1 + character1

let stringPlusString = string1 + string2

let characterPlusString = character1 + string1

let characterPlusCharacter = character1 + character2



var instruction = "look over"

instruction += string2



var welcome = "good morning"

welcome += character1



let multiplier = 3

let message = "\(multiplier) times 2.5 is \(Double(multiplier)*2.5)"



let quotation = "We're a lot alike, you and I."

let sameQuotation = "We're a lot alike, you and I."

if quotation == sameQuotation{

    println("These two strings are considered equal")

}





let romeoAndJuliet = [

    "Act 1 Scene 1: Verona, A public place",

    "Act 1 Scene 2: Capulet's mansion",

    "Act 1 Scene 3: A room in Capulet's mansion",

    "Act 1 Scene 4: A street outside Capulet's mansion",

    "Act 1 Scene 5: The Great Hall in Capulet's mansion",

    "Act 2 Scene 1: Outside Capulet's mansion",

    "Act 2 Scene 2: Capulet's orchard",

    "Act 2 Scene 3: Outside Friar Lawrence's cell",

    "Act 2 Scene 4: A street in Verona",

    "Act 2 Scene 5: Capulet's mansion",

    "Act 2 Scene 6: Friar Lawrence's cell"

]



var act1SceneCount = 0

for scene in romeoAndJuliet{

    if scene.hasPrefix("Act 1"){

        ++act1SceneCount

    }

}

println("There are \(act1SceneCount) scenes in Act 1")



var mansionCount = 0

var cellCount = 0

for scene in romeoAndJuliet{

    if scene.hasSuffix("Capulet's mansion"){

        ++mansionCount

    } else if scene.hasSuffix("Friar Lawrence's cell"){

        ++cellCount

    }

}

println("\(mansionCount) mansion scenes;\(cellCount) cell scenes")



let normal = "Could you help me,please?"

let shouty = normal.uppercaseString

let whispered = normal.lowercaseString



let dogString = "Dog!"

for codeUnit in dogString.utf8{

print("\(codeUnit)")

}

print("\n")



for codeUnit in dogString.utf16{

print("\(codeUnit)")

}

print("\n")



for scalar in dogString.unicodeScalars{

    print("\(scalar.value)")

}

print("\n")



var shoppingList:String[]=["Eggs","Milk"] //var所以可以再加元素,let就不行了



var shoppingList = ["Eggs","Milk"] //因为类型推断,一个array必须包含同类元素,所以能推断出来是string类



println("The shopping list contains \(shoppingList.count) items.")



if shoppingList.isEmpty{

    println("The shopping list is empty.")

} else {

    println("The shopping list is not empty.")

}



shoppingList.append("Flour")

shoppingList += "Baking Powder"

shoppingList += ["Chocolate Spread","Cheese","Butter"]



var firstItem = shoppingList[0]



shoppingList[0] = "Six eggs"

shoppingList[4...6]=["Bananas","Apples"] //4...6有3个元素,所以3个元素被换成了2个。不能越界哦。

shoppingList.insert("Maple Syrup",atIndex:0)



let mapleSyrup = shoppingList.removeAtIndex(0)//删除并放到mapSyrup里,而且所有元素都往前移了一格

firstItem = shoppingList[0]



let apples = shoppingList.removeLast()//删除并赋值,减少了array长度



for item in shoppingList{  //遍历

    println(item)

}



for (index,value) in enumerate(shoppingList){

    println("Item \(index + 1):\(value)")

}

    //Item 1:Six eggs

    //Item 2:Milk

    //...

    

var someInts = Int[]()   //var someInts:Int[] = [1,2,3]   var someInts = [1,2,3] 

println("someInts is of type Int[] with \(someInts.count) items.")



someInts.append(3)

someInts = []



var threeDoubles = Double[](count:3,repeatedValue:0.0)

var anotherThreeDoubles = Array(count:3,repeatedValue:2.5)//inferred as Double[]



var sixDoubles = threeDoubles + anotherThreeDoubles



var airports:Dictionary<String,String> = ["TYO":"Tokyo","DUB":"Dublin"]

var airports = ["TYO":"Tokyo","DUB":"Dublin"]

println("The dictionary of airports contains \(airports.count) items.")

airports["LHR"] = "London"



airports["LHR"] = "London Heathrow"



if let oldValue = aiports.updateValue("Dublin International", forKey:"DUB"){

    println("The old value for DUB was \(oldValue).")

}



if let airportName = airports["DUB"]{

    println("The name of the airport is \(airportName).")

} else {

    println("That airport is not in the airports dictionary")

}



airports["APL"] = "Apple International"

airports["APL"] = nil //从字典里删元素



if let removedValue = airports.removeValueForKey("DUB"){

    println("The removed airport's name is \(removedValue).")

} else {

    println("The airports dictionary does not contain a value for DUB.")

}



for(airportCode, airportName) in airports{

    println("\(airportCode):\(airportName)")

}



for airportCode in airports.keys{

    println("Airport code:\(airportCode)")

}



for airportName in airports.values{

    println("Airport name:\(airportName)")

}



let airportCodes = Arrary(airports.keys)

let airportNames = Arrary(airports.values)



//dictionary里元素没有顺序,所以遍历时顺序不确定和插入时顺序一致



var namesOfIntegers = Dictionary<Int,String>()//初始化一个空字典

namesOfIntegers[16]="sixteen"//可以类型推断出来

namesOfIntegers = [:]//再次置为空值,但类型不变





//let的immutable的dictionary不能改变key,一旦设定value后也不能改变key的对应value。arrary则可以改变value。都不能增加长度

//如果长度固定,尽量用let



for index 1...5{ //index隐式声明,不用let

    println("\(index) times 5 is \(index * 5)")

}



let base = 3

let power = 10

var answer = 1

for _ in 1...power{//如果元素无所谓,可以下划线代替

    answer *= base

}

println("\(base) to power of \(power) is \(answer)")



let names = ["Anna","Alex","Brian","Jack"]

for name in names{

    println("Hello,\(name)!")

}



let numberOfLegs = ["spider":8,"ant":6,"cat":4]

for (animalName,legCount) in numberOfLegs{

    println("\(animalName)s have \(legCount) legs")

}



for character in "Hello"{}

    println(character)

}



for var index = 0; index < 3; ++index{

    println("index is \(index)")

}



var index:Int

for index = 0; index <3; ++index{

    println("index is \(index)")

}

println("The loop statements were executed (\index) times")



let finalSquare = 25

var board = Int[](count: finalSquare + 1,repeatedValue:0)



board[03]=+08;board[06]=+11;board[09]=+09;board[10]=+02

board[14]=-10;board[19]=-11;board[22]=-02;board[24]=-08



var square = 0

var diceRoll = 0

while square < finalSquare{

    //roll the dice

    if ++diceRoll==7{diceRoll = 1}

    //move by the rolled amount

    square += diceRoll

    if square < board.count{

        square +=board[square]

    }

    

}



println("Game over!")





do{

square += board[square]



if ++diceRoll == 7 {diceRoll = 1}



square += diceRoll

} while square < finalSquare

println("Game over!")



var temperatureInFahrenheit = 30

if temperatureInFahrenheit <= 32{

    println("It's very cold. Consider wearing a scarf.")

}

//###############################################################################

temperatureInFahrenheit = 40

if temperatureInFahrenheit <= 32{

    println("It's very cold. Consider wearing a scarf.")

} else {

    println("it's not that cold. Wear a t-shit.")

} 



temperatureInFahrenheit = 90

if temperatureInFahrenheit <= 32{

    println("It's very cold. Consider wearing a scarf.")

}    else if temperatureInFahrenheit >= 86{

    println("It's really warm. Don't forget to wear sunscreen")

} else {

    println("it's not that cold. Wear a t-shit.")

} 



let someCaracter:Character = "e"

switch someCharacter{

case "a","e","i","o","u":

    println("\(someCharacter) is a vowel")

case "b","c":

    println("\(someCharacter)is a consonant")

default:

    println("\(someCharacter) is not a vowel or a consonant")

}



//switf 的switch语句的各个case之间没有顺序执行关系。跑完一个case之后会直接结束,而不是接着跑下一个case

//一般不用写break了。但想用的时候还是可以用break的。

//case后面必须至少包含一个可执行语句,否则会报错。

let anotherCharacter:Character = "a"

switch anotherCharacter{

case "a":

case "A":

    println("The letter A")

default:

    println("Not the letter A")

}

//那要多项匹配时就可以用逗号隔开

//Range匹配

let count = 3_000_000_000_000

let countedThings = "stars in the Milky Way"

var naturalCount:String

switch count {

case 0:

    naturalCount = "no"

case 1...3:

    naturalCount = "a few"

case 4...9:

    naturalCount = "several"

case 10...99:

    naturalCount = "tens of"

case 100...999:

    naturalCount = "hundreds of"

case 1000...999_999:

    naturalCount = "thousands of"

default:

    naturalCount = "millions and millions of"

}

println("There are \(naturalCount) \(countedThings)")



//tuple.0里的0是index下标

//如果同时匹配上了多个case,则第一个生效,其他忽略

let somePoint = (1,1)

switch somePoint{

case(0,0):

    println("(0,0) is at the origin")

case(_,0):

    prinltn("(\(somePoint.0),0) is on the x-axis")

case(0,_):

    println("(0,\(somePoint.1)) is on the y-axis)

case(-2...2,-2...2):

    println("(\(somePoint.0),\(somePoint.1)) is inside the box")

default:

    println("(\(somePoint.0),\(somePoint.1)) is outside of the box")

}





let anotherPoint = (2,0)

switch anotherPoint{

case(let x,0):

    println("on the x-axis with an x value of \(x)")

case (0,let y):

    println("on the y-axis with a y value of \(y)")

case let(x,y):

    println("somewhere else at (\(x),\(y))")

}



let yetAnotherPoint = (1,-1)

switch yetAnotherPoint{

case let(x,y) where x == y:

    println("(\(x),\(y)) is on the line x == y")

case let(x,y) where x == -y:

    println("(\(x),\(y)) is on the line x == -y")

case let(x,y):

    println("(\(x),\(y)) is just some arbitrary point")

}



let puzzleInput = "great minds think alike"

var puzzleOutput = ""

for character in puzzileInput {

    switch character{

    case "a","e","i","o","u"," ":

        continue

    default:

        puzzleOutput += character

    }

}

println(puzzleOutput)





//switch中可以用break来表示忽略一个case

let numberSymbol:Character = ""

var possibleIntegerValue:Int?

switch numberSymbol{

case "1", "١" ,"", "":

    possibleIntegerValue = 1

case "2", "٢" ,"", "":

    possibleIntegerValue = 2

case "3", "٣" ,"", "":

    possibleIntegerValue = 3

case "4", "٤" ,"", "":

    possibleIntegerValue = 4

default:

    break

}



if let integerValue = possibleIntegerValue{

    println("THe integer value of \(numberSymbol) is \(integerValue)")

} else {

    println("An integer value could not be found for \(numberSymbol)")

}



let integerToDescribe = 5

var description = "The number \(integerToDescribe) is"

switch integerToDescribe{

    description += "a prime number, and also"

    fallthrough

default:

    description += "an integer."

}

println(description)





let finalSquare = 25

var board = Int[](count: finalSquare + 1,repeatedValue:0)



board[03]=+08;board[06]=+11;board[09]=+09;board[10]=+02

board[14]=-10;board[19]=-11;board[22]=-02;board[24]=-08



var square = 0

var diceRoll = 0

gameLoop:while square!=finalSquare{

    if ++diceRoll == 7 {diceRoll = 1}

    switch square + diceRoll {

    case finalSquare:

        break gameLoop

    case let newSquare where newSquare>finalSquare:

        continue gameLoop

    default:

        square += diceRoll

        square += board[square]

    }

}

println("Game over!")



func sayHello(personName:String) -> String{

    let greeting = "Hello," + personName + "!"

    return greeting

}



println(sayHello("Anna"))

println(sayHello("Brian"))



func sayHelloAgain(personName:String) -> String{

    return "Hello again," + personName + "!"

}

println(sayHelloAgain("Anna"))



func halfOpenRangeLength(start:Int,end:Int) -> Int{

    return end - start

}

println(halfOpenRangeLength(1,10))



func sayHelloWorld() -> String{

    return "hello,world"

}

println(sayHelloWorld())



//其实返回了空tuple()

func sayGoodbye(personName:String){

    println("Goodbye,\(personName)!")

}

sayGoodbye("Dave")



func printAndCount(stringToPrint:String) -> Int{

    println(stringToPrint)

    return countElements(stringToPrint)

}

func printWithoutCounting(stringToPrint:String){

    printAndCount(stringToPrint)

}

printAndCount("hello,world")

printWithoutCount("Hello,world")



//func里用tuple返回多个值

func count(string:String) ->(vowels:Int,consonants:Int,others:Int){

    var vowels = 0, consonants = 0, others = 0

    for character in string{

        switch String(character).lowercaseString{

        case "a","e","i","o","u":

            ++vowels

        case "b","c",xxxxxxxxxxxxxxxx:

            ++consonants

        default:

            ++others

        }

    }

    return (vowels,consonants,others)

    

}



let total = count("some arbitrary string!")

println("\(total.vowels) vowels and \(total.consonants) consonants")



//patameterName是局部变量,只在func体内生效

func someFunction(parameterName:Int){

}

//如果定义了external paramter name,那调用时必须使用他

func someFunction(externalParameterName localParameterName:Int){

}



//不用external paramter name时,调用方法的时候看不出来每个参数是什么

func join(s1:String,s2:String,joiner:String) -> String{

    return s1 + joiner + s2

}

join("hello","world",",")

//用了external paramter name的话

func join(string s1:String, toString s2:String, withJoiner joiner:String) -> String{

    return s1 + joiner +s2

}

join(string:"hello",toString:"world",withJoiner:",")



//external parameter简写

func containsCharacter(#string:String,#characterToFind:Character) -> Bool{

    for character in string{

        if character == characterToFind{

            return true

        }

    }

    return false

}



let containsAVee = containsCharacter(string:"aardvark",characterToFind:"v")



//默认值

func join(string s1:String, toString s2:String, withJoiner joiner:String = "") ->{

    return s1 + joiner +s2

}

//如果有传值,就正常调用

join(string:"hello",toString:"world",withJoiner:"=")

//如果没有传,就用默认值了

join(string:"hello",toString:"world")



//如果有了默认值,就自动有了external parameter name

func join(s1:String, s2:String, joiner:String = " ")->String{

    return s1 + joiner + s2

}



join("hello","world",joiner:"-")



//variadic parameter加三个点.一个数组。每个方法最多一个可变参数,一定要放最后

func arithmeticMean(numbers:Double...)->Double{

    var total:Double = 0

    for number in numbers{

        total += number

    }

    return total / Double(numbers.count)

}



arithmeticMean(1,2,3,4,5) //3.0

arithmeticMean(3.8.19)//10.0





//constant and variable parameters

//默认都是constant。而variable参数是copy一个参数的值来用。可以改。

func alinRight(var string:String, count:Int, pad:Character) -> String{

let amountToPad = count- countElements(string)

for _ in 1...amountToPad{

    string = pad + string

}

return string

}

let originalString = "hello"

let paddedString = alignRight(originalString,10,"-")

//-----hello

//注意,这里,originalString值没改。



//inout 参数

//这个类型的参数跟上面这个不同,会影响original string

//inout不能是可变参数,

//inout 不能用var、let来标记,默认var

func swapTwoInts(inout a:Int, inout b:Int){

    let temporaryA = a

    a = b

    b = temporaryA

}





var someInt = 3

var anotherInt = 107

swapTwoInts(&someInt,&anotherInt)

//这里注意加了&符号,这样才能用于inout参数



func addTwoInts(a: Int, b: Int) -> Int{

    return a + b

}



func multiplyTwoInts(a: Int, b: Int) -> Int{

    return a * b

}



func printHelloWorld(){

    println("hello, world")

}



// (Int, Int) -> Int 是func的type,addTwoInts是一个func,这里把这个func赋值给一个var

var mathFunction: (Int, Int) -> Int = addTwoInts



println("Result: \(mathFunction(2,3))")//5



mathFunction = multiplyTwoInts



println("Result: \(mathFunction(2,3))")//6





let anotherMathFunction = addTwoInts //类型推断也可以适用



//func做参数

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int){

    println("Result: \(mathFunction(a,b))")

}

printMathResult(addTwoInts, 3, 5)

printMathResult(multiTwoInts, 3, 5)



//func做返回值

func stepForward(input: Int) -> Int{

    return input + 1

}



func stepBackward(input: Int) -> Int{

    return input - 1

}



func chooseStepFunction(backwards: Bool) -> (Int) -> Int {

    return backwards ? stepBackward : stepForward

}



var currentValue = 3

let moveNearerToZero = chooseStepFunction(currentValue > 0)//然后moveNearerToZero就指向了stepBackward()了





println("Counting to zero:")

//Counting to zero:

while currentValue != 0 {

    println("\(currentValue)...")

    currentValue = moveNearerToZero(currentValue)

}

println("zero!")

//3...

//2...

//1...

//zero!





//nested func 

func chooseStepFunction(backwards: Bool) -> (Int) -> Int{

    func stepForward(input: Int) -> Int { return input + 1 }

    func stepBackward(input: Int) -> Int { return input - 1 }

    return backwards ? stepBackward : stepForward

}



var currentValue =  -4

let moveNearerToZero = chooseStepFunction(currentValue > 0)

//now it  refers to the nested stepForward() function



while currentValue != 0{

    println("\(currentValue)...")

    currentValue = moveNearerToZero(currentValue)

}

println("zero!")

//-4...

//-3...

//-2...

//-1...

//zero!





let names = ["Chris","Alex","Ewa","Barry","Daniella"]



func backwards(s1: String, s2: String) -> Bool {

    return s1 > s2

}



var reversed = sorted(names, backwards)



reversed = sorted( names, { (s1: String, s2: String) -> Bool in 

    return s1 > s2

})



reversed = sorted(names, {s1,s2 in return s1 > s2})



reversed = sorted(names, {s1, s2 in s1 > s2})



reversed = sorted(names, {$0 > $1})



reversed = sorted(names, >)



func someFunctionThatTakesAClosure(closure: () -> ()){

//xxxxxxxxxxxxxxxxx

}



//普通调用

someFunctionThatTakesAClosure({

//xxxx

})

//trailing closure调用

someFunctionThatTakesAClosure(){

//xxxx

}



reversed = sorted(names){$0 > $1}





let digitNames = [0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 

                  5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine",

]



let numbers = [16,58,150]





let strings = numbers.map {

    (var number) -> String in

    var output = ""

    while number > 0 {

        output = digitNames[number % 10]! + output

        number /= 10

    }

    return output

}



func makeIncrementor(forIncrement amount: Int) -> () -> Int{

    var runningTotal = 0

    func incrementor() -> Int{

        runningTotal += amount

        return runningTotal

    }

    return incrementor

}



let incrementByTen = makeIncrementor(forIncrement: 10)

incrementByTen()// 10

incrementByTen()// 20



let incrementBySeven = makeIncrementor(forIncrement: 7)

incrementBySeven()//7

incrementByTen()// 30



let alsoIncrementByTen = incrementByTen

alsoIncrementByTen()//40





enum SomeEnumeration {

    //enumeration definition here

}
View Code

 

你可能感兴趣的:(swift)