swift自学笔记(三)(泛型、守护、属性观察、扩展、单例)
2016-01-24 23:04
519 查看
// 一.泛型的使用,如下,交换两个数的数值,如果数的类型改变我们还得重写方法,但是有了泛型就不需要了,(将类型指为泛型 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里进行异常捕获
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.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,3,44,4,4,2,].filter{$0
> 5}
// 单例
class TestObject {
privatestatic
let testObject =
TestObject()
// static:表示这个属性是属于这个类的而不属于他具体的对象
static var sharedInstance:TestObject {
return testObject
}
private
init(){
}
}
// 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.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,3,44,4,4,2,].filter{$0
> 5}
// 单例
class TestObject {
privatestatic
let testObject =
TestObject()
// static:表示这个属性是属于这个类的而不属于他具体的对象
static var sharedInstance:TestObject {
return testObject
}
private
init(){
}
}
相关文章推荐
- Apple Swift学习教程
- JAVA泛型—— 3fe8 转
- JAVA泛型详解——转
- 介绍 Fedora 上的 Swift
- C#、ASP.NET通用扩展工具类之TypeParse
- Lua编程示例(二):面向对象、metatable对表进行扩展
- Windows Powershell扩展类型系统
- 编写高质量代码改善C#程序――使用泛型集合代替非泛型集合(建议20)
- C#、ASP.NET通用扩展工具类之LogicSugar
- C#通过反射创建自定义泛型
- C#泛型用法实例分析
- SQL Server下几个危险的扩展存储过程
- jQuery 学习第七课 扩展jQuery的功能 插件开发
- 运行Node.js的IIS扩展iisnode安装配置笔记
- 基于MySql的扩展功能生成全局ID
- jquery通过扩展select控件实现支持enter或focus选择的方法
- C语言泛型编程实例教程
- 一个扩展时间段的dir命令的vbs脚本
- Ruby中使用SWIG编写ruby扩展模块实例