Swift之旅:2.完成计算器,初探MVC设计模式

斯坦福大学公开课:iOS8

网易空开课地址链接:斯坦福大学公开课: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值