swift练习

闲来无事,看的例子还是觉得自己先敲一遍,印象会深刻些!例子涉及的都是swift简单的语法。

基本练习


    var str = "Hello, playground"
    var cc: Int?
    cc = 100

    let ccc: Int = 200;

    let z = cc!+ccc

    print("cc===\(cc)ccc===\(z)")


    let y = "30";
    let yy = Int(y);
    print("yy==\(yy)")


    var kj: String?
    if let newkj = kj{

    var kjj = kj!+"jfkjkd"

    }else{

    print("kj===\(kj)")
    }

    var age: Int! = 0

    var agee = age+100

    if let newage = age{

    print("agee=\(agee)")

    }


``` bash

### ...用法


    for i in 1..<100{

    print("i=\(i)")

    }

    var strr = "hello world"
    var range = "a"..."z"
    for t in strr.characters{


    if range.contains(String(t)){

        print(t)
    }
    }

``` bash
### 分支语句

    var lista = ["a","b","c","d","e","f"]
    let bb = lista[1]

    switch bb {

    case "a","b":
    print("b=a")
    default:
    break

    }


``` bash
###  闭包

    func sum(num1 num1:Int,num2:Int) -> Int{


    return num1+num2
    }

    sum(num1: 100, num2: 200)

    func add() -> ()->Int{


    var total = 0
    var step = 1

    func fn()->Int{

        total+=step
        return total
    }

    return fn

    }

    print(add())

``` bash
###  类


    class Person {

    var name:String?

    init(name:String){

        self.name = name

    }
    deinit{

        print("die")
    }

    func showMessage(content: String){

        print("my name is \(self.name)+\(content)")

    }
    }

    var p = Person(name: "gh")
    p.showMessage("are you ok")

    var p2 = p
    p2.name = "wx"
    p2.showMessage("not")

    if p === p2 {

    print("the same")

    }



``` bash
### 属性

    class Account {

    var balance:Double = 0.0{

        willSet{

            self.balance = 2.0
            print("willset.balance,newvalue=\(newValue) value=\            (self.balance)")
        }
        didSet{

            self.balance = 3.0
            print("didset.balance,newvalue=\(oldValue) value=\            (self.balance)")
        }

    }


}


    class Personn {

    //存储属性
    var firstName:String
    var lastName:String

    let age:Int

    init(first:String,last:String){

        self.firstName = first
        self.lastName = last
        age = 28
    }



    //计算属性

    //计算属性并不直接存储一个值,而是提供getter来获取一个值,或者利用setter来间接设置其他属性;
    // lazy属性必须有初始值,必须是变量不能是常量(因为常量在构造完成之前就已经确定了值);
    //在构造方法之前存储属性必须有值,无论是变量属性(var修饰)还是常量属性(let修饰)这个值既可以在属性创建时指定也可以在构造方法内指定;

    var fullName:String{

        get
        {

            return self.firstName+"."+self.lastName

        }
        set
        {

            print("newValue===\(newValue)")

        }

    }

    lazy var acc = Account()

    func showMessage(){

        print("name=\(self.fullName)")

    }

    //类属性
    static var skin:[String]{

        return ["yellow","white","black"]

    }


    class func classMethod(){


        print("class method")

    }

    final func sayHello(){


        //子类无法重载
    }

}

    var pn = Personn(first: "wang", last: "guohui")
    pn.acc.balance = 100
    pn.showMessage()
    Personn.classMethod()

    for color in Personn.skin{

    print(color)
    }

    class Student: Personn {

    override func showMessage() {

        print("student===\(self.firstName).\(self.lastName)")
    }

    override var fullName:String{

        get{

            return super.fullName
        }
        set{



        }

    }
}

    var s = Student(first: "xiao", last: "ming")
    s.showMessage()

``` bash
### 协议

    protocol Named{

    var name:String {get set}
    static var className:String{get}
    init(name:String)
    func showName()
    static func showClassName()

    }


    protocol Scored{

    var score:Double{get set}

    }

    class Person2: Named {

    var name:String
    var age:Int = 0
    static var className:String{

        return "Person2"
    }
    required init(name: String) {
        self.name = name
    }
    func showName() {
        print("name=\(self.name)")
    }
    static func showClassName() {

        print("Class name is Person2")
    }
}

    class Student2: Person2,Scored {

    var score:Double = 0.0

    init(name: String, score:Double) {

        self.score = score;
        super.init(name: name)

    }
    required init(name:String){

        super.init(name:name)
    }
    func test(){


        print("\(self.name) is testing.")
    }

}

    var p22 = Person2(name: "Kenshin Cui")
    p22.showName()
    print("classname=\(Person2.className)")
    Person2.showClassName()
    p22.age = 30


    var s22 = Student2(name: "Kaoru", score: 100)
    s22.showName()

    let b1 = s22 is Scored
    if b1{

    print("s22 has score property")
    }

    if let s33 = s22 as? Scored{

    print("s33 score is\(s33.score)")
    }

    let s44 = s22 as Scored
    print("s44 score is\(s44.score)")


``` bash
### 扩展


    extension Person{

    //只能扩展便利构造器
    convenience init(){
        self.init()
    }

    //只能扩展计算属性
    var personInfo:String{

        return "firstname"

    }
    //扩展实例方法
    func sayGreet(){


        print("say hello")
    }

    //嵌套类型
    enum Hoppy{

        case Reading,Swimming,Sing
    }

    //扩展类型方法
    static func hoppy() -> [Hoppy]{

        return [.Reading,.Swimming,.Sing]
    }


}

    var pex = Person(name: "xiao hua")
    pex.sayGreet()
    Person.hoppy()



``` bash
### 结构体

    struct World{

    var name:String
    var child:String
    var intro:String{

        return "a beautilully"
    }

    func showMessage(){

        print(name+"  "+child)
    }
    static func showStructName(){

        print("world")

    }


}

    var w = World(name: "earth", child: "china")
    w.showMessage()
    World.showStructName()

    var w2 = w
    w2.name = "earth2"
    w2.child = "amera"
    w2.showMessage()
    w.showMessage()




``` bash
### 枚举


    enum Season:Int{

    case Spring = 10
    case Summer
    case Autumn
    case Winter

    }

    var sen = Season.Spring

    switch sen {

    case .Spring:
    print("spring")
    case .Summer:
    print("summer")
    case .Autumn:
    print("autumn")
    default:
    print("winter")


    }
    var sum = Season.Summer
    print("summer=\(sum)")




## 2.0 新特性

``` bash
### 异常处理

    enum WechatError: ErrorType{

    case NoBattery
    case NoNetwork
    case NoDataStream

    }


    class STwo {

    func check(person:[String:String]){

        guard let id = person["id"] else {

            print("没有身份证,不得进场")
            return
        }

        guard let exam = person["exam"] else{

            print("没有准考证,不得进场")
            return

        }

        print("身份证:\(id),准考证\(exam)")


        if #available(iOS 8,*){

            print("ios 8 +")

        }else{


            print("ios8 -")
        }



        var i = 0
        repeat {

            i++
            print(i)

        }while i < 100


    }


    func checkIsWeChatOk(isPhoneHasBattery:Bool,isPhoneHasNetwork:Bool,dataStream:Int) throws{


        guard isPhoneHasBattery else{

            throw WechatError.NoBattery

        }

        guard isPhoneHasNetwork else{

            throw WechatError.NoNetwork
        }

        guard dataStream > 50 else{

            throw WechatError.NoDataStream

        }

    }


    func playWechat(isPhoneHasBattery:Bool,isPhoneHasNewwork:Bool,dataSteam:Int){

        do{

            try checkIsWeChatOk(isPhoneHasBattery, isPhoneHasNetwork: isPhoneHasNewwork, dataStream: dataSteam)

            print("没有异常,every ok")


        }catch WechatError.NoBattery{

           print("没电了")

        }catch WechatError.NoNetwork{

            print("没网了")


        }catch WechatError.NoDataStream{

            print("没流量了")


        }catch{


            print("见鬼了")
        }

    }
}

    var tt = STwo()
    tt.check(["id":"1234"])
    tt.check(["exam":"4321"])
    tt.check(["id":"1234","exam":"4321"])

    tt.playWechat(true, isPhoneHasNewwork: true, dataSteam: 25)

``` bash
### Block

    typealias funcBlock = () -> ()//无参无返回值
    typealias funcBlockA = (Int,Int) -> String
    typealias funcBlockB = (Int,Int) -> (String) -> Void //返回值是函数指针
    typealias funcBlockC = (Int,Int) -> (String) -> String

    class blockDemo {

    var blockPropertyNo:funcBlock = {print("no return exec")}
    var blockProperty:funcBlockA = {a,b in return String(a+b)}
    var blockPropertyA:funcBlockA?
    var blockPropertyB:funcBlockB!

    init(){



    }




}