Swift之旅:2.完成计算器,初探MVC设计模式
2015-06-20 16:04
453 查看
斯坦福大学公开课:iOS8
网易空开课地址链接:斯坦福大学公开课:IOS8开发
github上字幕链接:字幕
百度网盘资源下载链接:百度网盘
①回车键及相关的代码
这里面的displayValue定义其get和set方法:
func stringFromNumber(number:NSNumber) ->
String? NSNumber 转换成String
func numberFromString(string:String) ->
NSNumber? String 转汉城 NSNumber
NSNumberFormatter().numberFromString(display.text!)!.doubleValue将字符串转换为NSnumber,然后将NSNumber转换为Double。
NSNumberFormatter()是用来初始化实例用的,这里是隐式,表示用对象来引用其中的方法。
②加减乘除开根号运算
①Swift中可以将一个方法作为另一个方法的参数:
performOperation(multiply)是将multiply方法作为performOperation方法的参数
②Swift中可以隐式的将一个方法作为另一个方法的参数
performOperation(
{(op1:Double, op2:Double)->Doublein
return op1 + op2;})
可以看到隐式方法作为参数的时候,要放在{}里面,称之为闭包
in后面表示方法内部的操作
③Swift有类型自动推导的功能,所以可以简写为:
performOperation( {(op1, op2)in op1
+ op2;})
④Swift中编译器会自动给方法中的参数传一个默认值,第一个参数$0,第二个参数$1........
所以可以继续简化为:performOperation({ $0 + $1})
⑤Swift中如果一个方法是另外一个方法的最后一个参数,那么可以将此方法放到原方法后面:
performOperation(){ $0 + $1}
方法中无参数了可以直接去掉():performOperation(){$0
+ $1}
这里要重点解释一下方法重载问题:
Swift语言支持方法重载,OC不支持方法的重载:
func performOperation(operation: (Double,Double)->Double)
func performOperation(operation:Double->Double)
这两个方法,名称一样,但是参数个数不一样,属于方法重载。如果按照课程上说的,直接这么用会出现问题。
错误提示:Method 'perform' with Objective-C selector 'perform: ' conflicts with previous
declaration with the same Objective-C selector
原因是:这个类继承自UIViewController,也继承NSObject,编译器于是会按照OC中属性的约束来编译,所以就会报错。
修改这个错误方法很简单:
1.将两个函数的名字取不一样
2.用一个OC不支持的类型来阻止Swift语言的编译器按照OC方式揭发这个错误。
解释一下:
1.绿色的箭头表示Controller对Model和View的直接引用。直接引用很简单,只需要在Controller中定义Model和View的实例变量。如果是通过storyboard或者xib定义View,则有IBOutlet。
2.View向Controller通信有三种方式(三个黄色箭头):
①action对应target。例如UIButton中的Touch down,action(点击按钮) target添加方法。
②设置View的delegate(代理),如UITabViewDelegate,在Controller中实现代理。
③设置View的data source(数据源), 如UITableViewDataSource。
这样View达到了既能向Controller通讯,又不需要知道具体的Controller是谁是目的,这样就和Controller解耦了。
3.Model图形上面有一个信号塔,旁边写着Notification
& KVO。Model主要是通过通知和键值监听来和Controller通讯的。
4.Controller在MVC可以和View和Model相互通信,但是Model和View之间无法通信,用黄线隔开。
===============================================================================================================================
Demo:http://download.csdn.net/detail/misakahina/8824853
网易空开课地址链接:斯坦福大学公开课:IOS8开发
github上字幕链接:字幕
百度网盘资源下载链接:百度网盘
1.计算器完成
①回车键及相关的代码//定义一个数组,用来当做栈保存数据使用 var openStack = Array<Double>(); //enter用来执行进栈操作 @IBAction func enter() { //设置重新开始输入字符串 userIsInTheMiddleOfTypingANumber = false //将value进栈 openStack.append(displayValue) println("openStack = \(openStack)") }
这里面的displayValue定义其get和set方法:
//用来进栈的数据 var displayValue: Double{ get{ //将字符串转换为double return NSNumberFormatter().numberFromString(display.text!)!.doubleValue } set{ //将value转换成字符串 display.text = "\(newValue)" //设置重新开始输入字符串 userIsInTheMiddleOfTypingANumber = false } }其中NSNumberFormatter类中比较常用的两个方法:
func stringFromNumber(number:NSNumber) ->
String? NSNumber 转换成String
func numberFromString(string:String) ->
NSNumber? String 转汉城 NSNumber
NSNumberFormatter().numberFromString(display.text!)!.doubleValue将字符串转换为NSnumber,然后将NSNumber转换为Double。
NSNumberFormatter()是用来初始化实例用的,这里是隐式,表示用对象来引用其中的方法。
②加减乘除开根号运算
//用来进行运算 @IBAction func operate(sender: UIButton) { //获得当前按钮的title let operation = sender.currentTitle //如果是中间输入的数字 if userIsInTheMiddleOfTypingANumber { //进栈 enter() } //switch判断是什么运算符,然后进行相应的运算 switch operation! { case "×":performOperation(multiply) case "÷":performOperation({(op1:Double, op2:Double)->Double in return op1 / op2;}) case "+":performOperation({(op1, op2) in op1 + op2;}) case "−":performOperation{$0 - $1} case "√":performOperation{sqrt($0)} default:break } } //定义一个方法用来进行加减乘除运算,参数类型是一个方法:(Double, Double)->Double private func performOperation(operation: (Double, Double)->Double) { //栈中必须有两个元素才能进行加减乘除的运算 if openStack.count >= 2 { //把最后的两个元素分别出栈,然后进行运算 displayValue = operation(openStack.removeLast(),openStack.removeLast()) enter() } } //定义一个方法用来开平方,参数类型是一个方法:Double->Double private func performOperation(operation: Double->Double) { //栈中必须多于一个元素才能进行开平方 if openStack.count >= 1 { displayValue = operation(openStack.removeLast()) enter() } }
①Swift中可以将一个方法作为另一个方法的参数:
performOperation(multiply)是将multiply方法作为performOperation方法的参数
②Swift中可以隐式的将一个方法作为另一个方法的参数
performOperation(
{(op1:Double, op2:Double)->Doublein
return op1 + op2;})
可以看到隐式方法作为参数的时候,要放在{}里面,称之为闭包
in后面表示方法内部的操作
③Swift有类型自动推导的功能,所以可以简写为:
performOperation( {(op1, op2)in op1
+ op2;})
④Swift中编译器会自动给方法中的参数传一个默认值,第一个参数$0,第二个参数$1........
所以可以继续简化为:performOperation({ $0 + $1})
⑤Swift中如果一个方法是另外一个方法的最后一个参数,那么可以将此方法放到原方法后面:
performOperation(){ $0 + $1}
方法中无参数了可以直接去掉():performOperation(){$0
+ $1}
这里要重点解释一下方法重载问题:
Swift语言支持方法重载,OC不支持方法的重载:
func performOperation(operation: (Double,Double)->Double)
func performOperation(operation:Double->Double)
这两个方法,名称一样,但是参数个数不一样,属于方法重载。如果按照课程上说的,直接这么用会出现问题。
错误提示:Method 'perform' with Objective-C selector 'perform: ' conflicts with previous
declaration with the same Objective-C selector
原因是:这个类继承自UIViewController,也继承NSObject,编译器于是会按照OC中属性的约束来编译,所以就会报错。
修改这个错误方法很简单:
1.将两个函数的名字取不一样
2.用一个OC不支持的类型来阻止Swift语言的编译器按照OC方式揭发这个错误。
2.MVC设计模式初探
解释一下:
1.绿色的箭头表示Controller对Model和View的直接引用。直接引用很简单,只需要在Controller中定义Model和View的实例变量。如果是通过storyboard或者xib定义View,则有IBOutlet。
2.View向Controller通信有三种方式(三个黄色箭头):
①action对应target。例如UIButton中的Touch down,action(点击按钮) target添加方法。
②设置View的delegate(代理),如UITabViewDelegate,在Controller中实现代理。
③设置View的data source(数据源), 如UITableViewDataSource。
这样View达到了既能向Controller通讯,又不需要知道具体的Controller是谁是目的,这样就和Controller解耦了。
3.Model图形上面有一个信号塔,旁边写着Notification
& KVO。Model主要是通过通知和键值监听来和Controller通讯的。
4.Controller在MVC可以和View和Model相互通信,但是Model和View之间无法通信,用黄线隔开。
===============================================================================================================================
Demo:http://download.csdn.net/detail/misakahina/8824853
相关文章推荐
- 分享微信开发Html5轻游戏中的几个坑
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 设计模式之创建型模式
- Apple Swift学习教程
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- 浅谈设计模式的学习
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- PHP设计模式之装饰者模式代码实例
- php设计模式之单例模式实例分析
- 介绍php设计模式中的工厂模式
- PHP设计模式之适配器模式代码实例
- Zend的MVC机制使用分析(二)