swift自学笔记(三)(泛型、守护、属性观察、扩展、单例)
// 一. 泛型的使用,如下,交换两个数的数值,如果数的类型改变我们还得重写方法,但是有了泛型就不需要了,(将类型指为泛型 T)inout表示形参改变(函数里面的形参改变,外面的实参也会跟着相应改变) // 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里进行异常捕获 throw Error.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 { // 添加观察的代码
if number > MaxValue { number = MaxValue } else if 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 { return self.description.uppercaseString } } ["key":"value"].upperDescription //现在的 key value就是大写的 // 4.map、flatMap、filter // 将数组里的每个元素乘以2可以用.map{$0 * 2}这种闭包实现。 var result = [1,2,3,43,4,5].flatMap{$0 * 2} //map不会过滤掉nil的、而flatMap会过滤掉nil //filter 得到一个由闭包返回结果为true的值组成的新序列 result = [2,44,].filter{$0 > 5} // 单例 class TestObject {
private static let testObject = TestObject() // static:表示这个属性是属于这个类的而不属于他具体的对象
static var sharedInstance:TestObject { return testObject }
private init(){
} } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |