swift自学笔记(三)(泛型、守护、属性观察、扩展、单例)


// .泛型的使用,如下,交换两个数的数值,如果数的类型改变我们还得重写方法,但是有了泛型就不需要了,(将类型指为泛型 Tinout表示形参改变(函数里面的形参改变,外面的实参也会跟着相应改变)

// swift中的数组和字典类型都是泛型

var num1 = 3, num2 =5


func swapValue<T>(inout num1:T,inout num2:T) {

    

    (num1, num2) = (num2, num1)

}


swapValue(&num1, num2: &num2)


num1

num2



// 同步api的异常处理

enum Error:ErrorType{// 定义一个异常的枚举

    case WrongJSON    // 实现协议

}


func test() throws{

    do{

     try NSJSONSerialization.JSONObjectWithData(NSData(), options: .AllowFragments)

    } catch {// catch里进行异常捕获

        throwError.WrongJSON//这里我们手动抛出一下

    }

}


do {

    try test()

}catch Error.WrongJSON {

    // 处理异常

}

// 异步api的异常处理(例如AFN请求)要使用泛型枚举



// .常用技巧

// 1 guard(守护)

// 可以把guard近似的看做是Assert(断言),但是你可以优雅的退出而非崩溃,guard中解包得到的值可以用于后面的代码,而if只有在代码块中才能使用if解包的值

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

    

    // 检查身份证,如果身份证没带则不能进入考场

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

        print("身份证没带则不能进入考场")

        return

    }

    

    // 检查准考证,如果准考证没带,则不能进入考场

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

        print("准考证没带,则不能进入考场")

        return

    }

    

    // 身份证和准考证齐全方可进入考场

    print("您的身份账号为:\(id),准考证号为:\(examNumber),请进入考场!")

    

}



checkup(["id":"12345"])

//checkup(["examNumber":"765421"])

//checkup(["id":"12345", "examNumber":"765421"])


// 2 属性观察(属性监听)下一篇笔记详细记录属性监听


let MaxValue = 999

let MinValue = -999


var number = 0 {

    // 添加属性观察的代码

willSet { // willSet在设置之前会触发代码块

    print("\(number)变为\(newValue)")

}

didSet { //添加观察的代码

    

    ifnumber > MaxValue {

        number = MaxValue

    } elseif number <MinValue {

        number = MinValue

    }

    print("\(oldValue)变为\(number)")

}

    

}


number = 12323


number


//思路:willSet在设置之前会触发代码块,获得新值(newValue),然后会执行didSet方法,在其中会获得旧值(oldValue



// 3.扩展

extension Int {//扩展

    

    func times(closure: (() -> ())?){ // 可选的闭包

        

        if self >=0 {

            for _in 0..<self {

                closure?()

            }

        }

        

    }

}


3.times{print("something")}


// 4.协议扩展

["wwww":"dddd"].description//description 可以将字典之类的以字符串的形式打印出来。但是这里打印的是小写的,那么我们想要打印出大写的怎么办呢?就要用到属性扩展,如下例:(扩展了CustomStringConvertible协议,)


extension CustomStringConvertible {

    var upperDescription:String {

        returnself.description.uppercaseString

    }

}


["key":"value"].upperDescription//现在的 key value就是大写的


// 4.mapflatMapfilter

// 将数组里的每个元素乘以2可以用.map{$0 * 2}这种闭包实现。

var result = [1,2,3,43,4,5].flatMap{$0 * 2}

//map不会过滤掉nil的、而flatMap会过滤掉nil

//filter 得到一个由闭包返回结果为true的值组成的新序列

result = [2,3,44,4,4,2,].filter{$0 > 5}


// 单例

class TestObject {

    

    privatestatic let testObject = TestObject() // static:表示这个属性是属于这个类的而不属于他具体的对象

    

    static var sharedInstance:TestObject {

        return testObject

    }

    

    private init(){

        

    }

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值