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

前端之家收集整理的这篇文章主要介绍了swift自学笔记(三)(泛型、守护、属性观察、扩展、单例)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


@H_301_2@

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

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

var num1 = 3,num2 = 5@H_301_2@


@H_301_2@

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

@H_301_2@

(num1,num2) = (num2,num1)@H_301_2@

}@H_301_2@


@H_301_2@

swapValue(&num1,num2: &num2)@H_301_2@


@H_301_2@

num1@H_301_2@

num2@H_301_2@


@H_301_2@


@H_301_2@

// 同步api的异常处理@H_301_2@

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

case WrongJSON // 实现协议@H_301_2@

}@H_301_2@


@H_301_2@

func test() throws{@H_301_2@

do{@H_301_2@

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

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

throw Error.WrongJSON //这里我们手动抛出一下@H_301_2@

}@H_301_2@

}@H_301_2@


@H_301_2@

do {@H_301_2@

try test()@H_301_2@

}catch Error.WrongJSON {@H_301_2@

// 处理异常@H_301_2@

}@H_301_2@

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


@H_301_2@


@H_301_2@

// .常用技巧@H_301_2@

// 1 guard(守护)@H_301_2@

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

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

@H_301_2@

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

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

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

return@H_301_2@

}@H_301_2@

@H_301_2@

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

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

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

return@H_301_2@

}@H_301_2@

@H_301_2@

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

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

@H_301_2@

}@H_301_2@


@H_301_2@


@H_301_2@

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

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

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


@H_301_2@

// 2 属性观察@H_301_2@


@H_301_2@

let MaxValue = 999@H_301_2@

let MinValue = -999@H_301_2@


@H_301_2@

var number = 0 {@H_301_2@

// 添加属性观察的代码@H_301_2@

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

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

}@H_301_2@

didSet { // 添加观察的代码@H_301_2@

@H_301_2@

if number > MaxValue {@H_301_2@

number = MaxValue@H_301_2@

} else if number < MinValue {@H_301_2@

number = MinValue@H_301_2@

}@H_301_2@

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

}@H_301_2@

@H_301_2@

}@H_301_2@


@H_301_2@

number = 12323@H_301_2@


@H_301_2@

number@H_301_2@


@H_301_2@

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


@H_301_2@


@H_301_2@

// 3.扩展@H_301_2@

extension Int { //扩展@H_301_2@

@H_301_2@

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

@H_301_2@

if self >= 0 {@H_301_2@

for _ in 0..<self {@H_301_2@

closure?()@H_301_2@

}@H_301_2@

}@H_301_2@

@H_301_2@

}@H_301_2@

}@H_301_2@


@H_301_2@

3.times{print("something")}@H_301_2@


@H_301_2@

// 4.协议扩展@H_301_2@

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


@H_301_2@

extension CustomStringConvertible {@H_301_2@

var upperDescription:String {@H_301_2@

return self.description.uppercaseString@H_301_2@

}@H_301_2@

}@H_301_2@


@H_301_2@

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


@H_301_2@

// 4.mapflatMapfilter@H_301_2@

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

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

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

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

result = [2,44,].filter{$0 > 5}@H_301_2@


@H_301_2@

// 单例@H_301_2@

class TestObject {@H_301_2@

@H_301_2@

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

@H_301_2@

static var sharedInstance:TestObject {@H_301_2@

return testObject@H_301_2@

}@H_301_2@

@H_301_2@

private init(){@H_301_2@

@H_301_2@

}@H_301_2@

}@H_301_2@ 原文链接:https://www.f2er.com/swift/324793.html

猜你在找的Swift相关文章