swift_calculator( 初学心得 )

最后呈现的UI

CE93F82D-C3E4-4C2B-8251-F3BC1703D676.png

mainStoryBoard布局

A2CC459F-CCF1-41B2-B5F1-4ECFA0355244.png
  @IBOutlet weak var display: UILabel!
  @IBAction func appendDigit(sender: UIButton) {}
  @IBAction func operate(sender: UIButton) {}
  @IBAction func enter() {}
  • display

    • var display 表示的是对一个变量的声明,@IBOutlet 意味着是 SB中 拖出的 引用,:表示继承的类别这是从SB(故事版的简称)中脱出的空间已经存在所以 UILable!中的!解包,表示这个实例对象是不能为nil的也就是不可optional。 weak是为了内存安全,不导致重复引用,这个Lb的创建是在SB而我们的控制器只是对他进行引用,所以你可以简单理解为 值传递 这里写出weak防止控件的引用计数器+ 1.
  • appendDigit

    • @IBAction,SB中发送的消息触发事件。 appendDigit ,0...9的Btn事件触发消息。(sender: UIButton) 触发事件的对象。
    • operate 同理 ,加减乘除发送的消息
    • enter。return键 的消息 。我们不关注发送的对象,只是关心事件的执行,省去( )中的参数,SB拖线中type选中 None
var userIsInputNum = false
    
    @IBAction func appendDigit(sender: UIButton) {
        let digit = sender.currentTitle!

        if userIsInputNum {
            display.text = display.text! + digit
        }else{
            display.text = digit
            print("display.text =  \(display.text!)")
            userIsInputNum = true
        }
    }

全局变量的声明在swift中是要赋予初始值的,let 和var 区别,let是一种值传递, userIsInputNum 用户是否正在进行计算操作,如果是第一次操作Lb的text是点击Btn上的数字。如果是正在操作计算则是文本拼接. 例如:6 按击 2次,Lb中显示66. swift中文本的拼接直接写+就行了,OC中却使用[NSString stringWithFormate...],方便吧!

   var openrandStack = Array<Double>()
   @IBAction func enter() {
        userIsInputNum = false
        openrandStack.append(displayValue)
        print("openrandStack = \(openrandStack)")
    }
    
    var displayValue : Double{
        get{
            return (NSNumberFormatter().numberFromString(display.text!)!.doubleValue)
        }
        set{
            display.text = "\(newValue)"
            userIsInputNum = false
        }
    }
  • 我们现在应该把计算要的数字存入我们的栈,也就是Array。var #变量名 = #类型<#存放中 遵循的类型> ()#赋予空间 ,每次return进入enter也就是用户的文本拼接结束,将之前Lb中拼接好的文本存入栈中。displayValue重写它的get 、set方法为的是将Lb的text转为Double类型符合规范。
    "\(newValue)"拼接为字符串 同print("display.text = \(display.text!)"),newValue 是在执行set方法时,传入的值

运算 ,我说下逻辑,用户可能在点击6 再去retrun,也可能是去点击 加减乘除的运算符,这个时候的效果都应该是存入栈,点击运算符只有当栈中的个数多于等于2 的时候才会执行。set的赋值在结束的一刻其实调用了get(希望大家明白)

@IBAction func operate(sender: UIButton) {
        let operation = sender.currentTitle!
        if userIsInputNum{
            enter()
        }
        switch operation{
            case "×" : performOperation{ $0 * $1 }
            case "÷" : performOperation{ $1 / $0 }
            case "−" : performOperation{ $1 - $0 }
            case "+" : performOperation{ $0 + $1 }
            case "√" : performOperation{ sqrt($0) }
            default  : break
        
        }
    }

    func performOperation(operation : (Double , Double) -> Double){
        if openrandStack.count >= 2{
            displayValue = operation(openrandStack.removeLast(),openrandStack.removeLast())
            print("displayValue =  \(displayValue)")
            enter()
        }
    
    
    }
   
    private func performOperation(operation : Double -> Double){
        if openrandStack.count >= 1{
            displayValue = operation(openrandStack.removeLast())
            enter()
        }

        
    }

performOperation { $0 * $1 }

performOperation({(po1 : Double , po2 : Double) -> Double in return po1 * pop })

因为swift编译的时候对变量名没有要求,而且performOperation中有函数指针的参数类型,没有声明的变量名用$0...$n表示,所以可以写成

performOperation({($0 * $1)})

而因为最后一个形参可以写在外部,并且无参()可以省略 -----> performOperation { $0 * $1 }

  • 算数平方根的求取,利用重载 方法,通过形参的个数让编译器自行判断发送消息的对象。
    • swift 中,控制器 的父类是UIViewController 而它 的父类 NSObject相当于导入了OC。因为oc中 重载的时候会报同名错误。所以在switf中加上private 私有化 区别。
AutoLayout
2C877D15-30D8-4D38-B362-A9A716210726.png

这是有规律的约束一起设置的方法。注意我除了按键其他的都是空白的按钮填充 ,使最后成为了5 * 4 的一个矩阵。然后选中所有的空间选中红箭头设置but 的 W 和 H,eaqul(相等)并且距离上(Lb),左右下(控制器 view边界)一个固定值。试试吧 小伙子

github源代码

有问题反馈

在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容