首页 > 代码库 > 寒城攻略:Listo 教你 25 天学会 Swift 语言 - 02 Swift Tour

寒城攻略:Listo 教你 25 天学会 Swift 语言 - 02 Swift Tour

import Foundation


//***********************************************************************************************

//1.Hello world

//_______________________________________________________________________________________________

//输出 "Hello, world"

println("Hello, world")    //使用 println函数来输出字符串


//***********************************************************************************************

//2.Simple Values(简单值)

//_______________________________________________________________________________________________

//使用 let 命名常量,使用 var 命名变量

let myConstant =42

var myVariable =42

myVariable = 50

println("The constant is\(myConstant),the variable is\(myVariable)")


//_______________________________________________________________________________________________

//声明数据类型

let explicitDouble:Double =70

println("The Double type number is\(explicitDouble)")


//_______________________________________________________________________________________________

//类型转化

let label = "The width is "

let width =94

let widthLabel = label + String(width)     //不同类型数据进行基本运算的时候需要进行类型转化

println(widthLabel)


//_______________________________________________________________________________________________

//简单的字符串引用数据

let apples =3

let appleSummary ="I have\(apples) apples"

println(appleSummary)


//_______________________________________________________________________________________________

//数组创建和使用

var shoppingList = ["water","bread","milk","paper","pen"]

println(shoppingList[2])           //获取数组中的第三个元素


//_______________________________________________________________________________________________

//字典的创建和使用

var occupations = ["Malcolm":"Captain","Kaylee":"Mechanic"]

occupations["Jayne"] ="Public relations"      //给字典添加或者修改一个元素,系统检索字典 occupations是否包含 key Jayne,如果有进行 key 对应的 value 值的修改,如果没有,进行新的 key value的添加

println(occupations)


//_______________________________________________________________________________________________

//创建空的数组和字典

let emptyArray = [String]()    //创建空的数组

let emptyDictionary =Dictionary<String,Float>()       //创建空的字典


//***********************************************************************************************

//3.Control Flow(控制流)

//_______________________________________________________________________________________________

//简单的控制语句

let individualScores = [75,43,103, 87, 12]

var teamScore =0

for score inindividualScores{

   if score >50{             //if语句之后必须为返回一个 Bool类型的数据

       teamScore +=3

    }

   else{

       teamScore +=1

    }

}

println("The teamscore is\(teamScore)")


//_______________________________________________________________________________________________

//可选类型数据

var optionalString:String? ="Hello"

optionalString == nil       //设置 optionalString数据为可选类型数据,可选类型是指 optionalString有具体的值或者为空两种情况


var optionalName:String? ="Joho Appleseed"

var greeting ="Hello"

if let name =optionalName{        //使用 if let 来判断可选类型数据是否有具体的值

   greeting ="Hello,\(name)"

}

println(greeting)


//_______________________________________________________________________________________________

//switch 语句

let vegetable ="red pepper"

var vegetableComment:String

switch vegetable{          //使用 switch语句,每一条 case 代表一条判断,符合条件则执行语句

    case"celery":

        vegetableComment ="Add some raisins and make ants on a log."

    case"cucumber","watercress":

        vegetableComment ="That would make a good tea sandwich."

    caselet xwhere x.hasSuffix("pepper"):            //使用 "x.hasSuffix("***")"函数来判断 x 变量末尾是否为 ***

        vegetableComment ="Is it a spicy\(x)?"

    default:

        vegetableComment ="Everything tastes good in soup."

}

println(vegetableComment)


//_______________________________________________________________________________________________

//使用 for in

let interestingNumbers = ["Prime": [2,3,5, 7, 11, 13],"Fibonacci": [1,1,2, 3, 5, 8],"Square": [1,4,9, 16, 25],]

var largest =0

for (kind, numbers)ininterestingNumbers{

   for numberin numbers{

       if number >largest{

           largest = number

        }

    }

}

println("The largest number is\(largest)")


//_______________________________________________________________________________________________

//使用 while do while 语句

var n =2

whilen <100{

   n =n * 2

}

println("the n is\(n)")


var m =2

do{

   m =m * 2

}whilem < 100

println("the m is\(m)")


//_______________________________________________________________________________________________

//范围运算符

var firstForLoop =0

for iin0..<4{            //使用 "..<"表示前闭后开范围

    firstForLoop += i

}

println("firstForLoop is\(firstForLoop)")


var secondForLoop =0

forvar i =0; i <4; ++i{     //使用一般方法进行运算

    secondForLoop += i

}

println("secondForLoop is\(secondForLoop)")


var thirdForLoop =0

for iin0...4{            //使用 "..."表示前闭后闭范围

    thirdForLoop += i

}

println("thirdForLoop is\(thirdForLoop)")


//***********************************************************************************************

//4.Function and Closures(函数和闭包)

//_______________________________________________________________________________________________

//函数的创建和使用

func greet(name: String, day: String) -> String{        //使用 "func 函数名(参数) -> 返回值类型{ return *** }" 来创建一个函数

    return"Hello\(name), today is \(day)"

}

println(greet("Bob","Tusday"))


//_______________________________________________________________________________________________

//无参数的函数

func getGasPrices() -> (Double,Double,Double){       //函数参数为空

    return (3.59,3.69,3.79)

}

println(getGasPrices())


//_______________________________________________________________________________________________

//不确定参数的函数

func sumOf(numbers:Int...) ->Int{        //当函数参数不确定数量的时候,使用 "..."即可

   var sum =0

   for numberin numbers{

        sum += number

    }

   return sum

}

println(sumOf(234,34,12))


//_______________________________________________________________________________________________

//函数嵌套

func returnFifteen() ->Int{

   var y =10

   func add(){

        y +=5

    }

   add()

   return y

}

println(returnFifteen())


//_______________________________________________________________________________________________

//函数作为返回值

func makeIncrementer() -> (Int ->Int){    //定义返回值为函数类型的函数 makeIncrementer

   func addOne(number:Int) -> Int{

       return1 + number

    }

    return addOne

}

var increment =makeIncrementer()

println(increment(7))


//_______________________________________________________________________________________________

//函数做参数

func hasAnyMatches(list: [Int], condition:Int ->Bool) -> Bool{    //设置参数为整型数组和函数类型的函数 hasAnyMatches

   for itemin list{

       if condition(item){

           returntrue

        }

    }

    return false

}

func lessThanTen(number:Int) ->Bool{     //定义函数符合 hasAnyMatches的参数类型

   return number <10

}

var numbers = [20,19,7, 12]

println(hasAnyMatches(numbers,lessThanTen))


//_______________________________________________________________________________________________

//闭包

var numberArray = [3,45,23, 523, 2]

let number =numberArray.map({           //Swift 中的 Array中有一个 map方法,其获取的一个闭包表达式作为其唯一参数,数组中的每一个元素调用次该闭包函数,并返回该元素所映射的值,具体的映射方式和返回值类型由闭包来指定

    (number:Int) -> Intin

   let result =3 * number

   return result

})

println(number)


//***********************************************************************************************

//5.Objects and Classes(对象和类)

//_______________________________________________________________________________________________

//类的创建

class Shape{               //使用 class声明一个类,类中的属性声明和声明常量变量一样,方法和函数声明是相同的方式

   var numberOfSides =0

   func simpleDescription() ->String{

        return"A shape with\(numberOfSides) sides."

    }

}


//_______________________________________________________________________________________________

//使用类

var shape = Shape()     //实例化一个类,注意类名首字母大写

shape.numberOfSides =7        //设置类的属性

var shapeDescription =shape.simpleDescription()       //访问类的方法

println(shapeDescription)


//_______________________________________________________________________________________________

//使用 init 创建一个类的初始化器

class NamedShape{

   var numberOfSides:Int = 0

   var name:String

    

   init(name:String){

        self.name = name       //self用来区分属性和参数,在初始化这个类时,每个初始值必须设置

    }

    

   func simpleDescription() ->String{

        return"\(name) find A shape with\(numberOfSides) sides."

    }

}

var name = NamedShape(name: "Listo")     //实例化并且初始化类 NameShape

name.numberOfSides =7

var nameDescription =name.simpleDescription()

println(nameDescription)


//_______________________________________________________________________________________________

//继承和覆写

class Square:NamedShape{

   var sideLength:Double

    

   init(sideLength:Double, name:String){

       self.sideLength = sideLength

       super.init(name: name)

        numberOfSides =4

    }

    

   func area() ->Double{

        returnsideLength *sideLength

    }

    

   overridefunc simpleDescription() ->String {          //使用 override来覆写父类中的方法

        return"A square with sides of length\(sideLength)"

    }

}

let test =Square(sideLength: 5.2, name: "my test square")

println(test.area())

println(test.simpleDescription())


//_______________________________________________________________________________________________

//除了简单的存储属性,属性可以有一个 getter setter

class EquilateralTriangle:NamedShape{

   var sideLength:Double =0.0

    

   init(sideLength:Double, name:String){

       self.sideLength = sideLength

       super.init(name: name)

        numberOfSides =3

    }

    

   var perimeter:Double{

   get{

       return3.0 *sideLength            //get 为获取这个属性的值

    }

   set{

       sideLength = newValue /3.0         //newValue代表 set给这个属性的新的值

    }

    }

    

   overridefunc simpleDescription() ->String {

        return"An equilateral triangle with side of length\(sideLength)"

    }

}

var triangle =EquilateralTriangle(sideLength:3.1, name: "a triangle")

println(triangle.perimeter)

triangle.perimeter =9.9

println(triangle.sideLength)


//_______________________________________________________________________________________________

//类中的方法和函数的区别

class Counter{

   var count:Int =0

   func incrementBy(amount:Int, numberOfTimes times: Int){

       count += amount * times

    }

}

var counter =Counter()

counter.incrementBy(2, numberOfTimes: 7)       //类中的方法需要在调用的时候写出参数的形参名(第一个参数名不可以写),函数在调用的时候除了外部参数存在的情况,否则不能参数的形参名


//***********************************************************************************************

//6.Enumeration and Structures(枚举和结构体)

//_______________________________________________________________________________________________

//枚举的创建

enum Rank: Int{         //使用 enum 创建一个枚举,注意枚举名用大写

    case Ace =1       //指定第一个原始值为 1,后面的数据一次递增分配

   case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten

   case Jack, Queen, King

   func simpleDescription() ->String{

        switchself{       //这里的 self 就是一个枚举类型的值(enum value

       case .Ace:

           return"ace"

       case .Jack:

           return"jack"

       case .Queen:

           return"queen"

       case .King:

           return"king"

       default:

            returnString(self.toRaw())    //使用 toRaw fromRaw 来实现原始值和枚举值的转换

        }

    }

}

let ace =Rank.Ace

println(ace.simpleDescription())

let aceRawValue =http://www.mamicode.com/ace.toRaw()

println(aceRawValue)


iflet convertedRank =Rank.fromRaw(3){

   let threeDescription = convertedRank.simpleDescription()

   println(threeDescription)

}


//_______________________________________________________________________________________________

//枚举成员是实际的值,不是其原始值的另外一种表达方式

enum Suit{

   case Spades, Hearts, Diamonds, Clubs

   func simpleDescription() ->String{

       switchself{

       case .Spades:

           return"spades"

       case .Hearts:

           return"hearts"

       case .Diamonds:

           return"diamonds"

       case .Clubs:

           return"clubs"

        }

    }

}

let hearts =Suit.Hearts

let heartDescription =hearts.simpleDescription()

println(heartDescription)


//_______________________________________________________________________________________________

//结构体的创建(结构体和类之间最重要的一个区别是,结构体通过复制传递,类通过引用传递)

struct Card{       //创建结构体,结构体名大写

   var rank:Rank

   var suit:Suit

   func simpleDescription() ->String{

        return"The\(rank.simpleDescription()) of\(suit.simpleDescription())"

    }

}

let threeOfSpades =Card(rank: .Three, suit: .Spades)

let threeOfSpadesDescription =threeOfSpades.simpleDescription()

println(threeOfSpadesDescription)


//_______________________________________________________________________________________________

//枚举的应用

enum ServerResponse{

   case Result(String, String)

   case Error(String)

}


let success = ServerResponse.Result("6:00 am","8:09 pm")

let failure = ServerResponse.Error("Out of cheese")


var serverResonse:String

switch success{

caselet .Result(sunrise, sunset):

    serverResonse ="Sunrise is at\(sunrise) and sunset is at\(sunset)"

caselet .Error(error):

   serverResonse ="Failure...\(error)"

}

println(serverResonse)


//***********************************************************************************************

//7.Protocols and Extensions(协议和扩展)

//_______________________________________________________________________________________________

//协议的创建

protocol ExamplePortocol{      //使用 protocol创建协议,协议名要大写

   var simpleDescription:String { get}

   mutatingfunc adjust()

}


//_______________________________________________________________________________________________

//类,枚举,结构体都可以写协议

class SimpleClass:ExamplePortocol{            //类遵守协议,必须实现协议中的方法

   var simpleDescription:String = "A very simple class."

   var anotherProperty:Int = 69105

   func adjust(){                             //在类中书写协议方法是不需要加上 mutating,因为一个类的方法可以修改类

        simpleDescription +=" Now 100% adjusted."

    }

}

var a = SimpleClass()

a.adjust()

let aDescription =a.simpleDescription

println(aDescription)


struct SimpleStructure:ExamplePortocol{       //结构体遵守协议,必须实现协议中的方法

   var simpleDescription:String = "A simple structure"

   mutating func adjust() {                  //在结构体中书写协议方法时要记得加上 mutating

        simpleDescription +=" (adjusted)"

    }

}

var b = SimpleStructure()

b.adjust()

println(b.simpleDescription)


//_______________________________________________________________________________________________

//使用 extension将扩展功能添加到现有的类型中

extensionInt:ExamplePortocol{            //为协议添加功能

   var simpleDescription:String{

    return"The number\(self)"

    }

   mutatingfunc adjust(){

       self +=42

    }

}


//_______________________________________________________________________________________________

//使用协议作为数据类型

let protocolValue:ExamplePortocol =a

println(protocolValue.simpleDescription)


//***********************************************************************************************

//8.Generics(通用数据类型)

//_______________________________________________________________________________________________

//尖括号内写一个名字做一个通用的函数或类型

func repeat<ItemType>(item:ItemType, times:Int) -> [ItemType] {      //做通用的类型

   var result = [ItemType]()

   for iin 0..<times{

        result += item

    }

   return result

}

println(repeat("Knock",4))


//_______________________________________________________________________________________________

//你可以通用形式的函数和方法,以及类、枚举、结构

enum OptionalValue<T>{

   case None

   case some(T)

}

var possibleInteger:OptionalValue<Int> = .None

possibleInteger = .some(100)

println(possibleInteger)