1、实验编号 :7四川师大 IOS 应用开发技术实验报告 2017 年 11 月 9日 计算机科学学院 2015 级 实验名称: Calculator 指导老师: _李贵洋 _ 实验成绩 :_ 实验 七 Calculator 一 、目的要求:通过实现一款功能完整的 Calculator,掌握 MVC 的主要思想 ; 二 、实验内容: (1) 参照 Stanford 视频 1 和 2 完成一个 Calculator 的制作; (2) 在 (1)的基础上进 一步完成 Stanford 作业 1 的完整要求。 (3) 采用 autolayout 的 stackview 和约束实现一下布局: 3、主要仪器
2、设备及药品: iMac( Mac OS、 XCode) 三、实验主要流程、基本操作或核心代码、算法片段(该部分如不够填写,请另加附页) 代码: ViewController.swift : / ViewController.swift / text7 / / Created by wu on 2017/11/9. / Copyright 2017 年 2015110445. All rights reserved. / import Cocoa class ViewController: NSViewController IBOutlet weak var display: NSTextFie
3、ldCell! /显示值的文本框 var isUerTyping = false /判断用户是否正在输入 override func viewDidLoad() super.viewDidLoad() / Do any additional setup after loading the view. /更改窗口背景图片 let image = NSImage(named: “timg“) let imageView = NSImageView(image: image!) imageView.frame = self.view.bounds self.view.addSubview(image
4、View, positioned: NSWindowOrderingMode.below, relativeTo: self.view) /设置文本框不可编辑 display.isEditable = false /输入值 (数组按钮和 .按钮 ) IBAction func setValue(_ sender: NSButton) if isUerTyping let title = sender.title if title != “.“ | !display.title.contains(“.“) display.title += title else display.title = s
5、ender.title isUerTyping = true /文本框中的显示值 var displayValue: Double get return Double(display.title)! set display.title = String(newValue) /实例化一个计算器的模型 private var operat = Operation() /进行计算 (特殊字符按钮 ) IBAction func operation(_ sender: NSButton) /先将文本框中的内容保存到结构体实例中 if isUerTyping operat.setOperand(oper
6、and: displayValue) isUerTyping = false /再进行计算 operat.performCalculation(symbol: sender.title) /最后显示结果 if let result = operat.result displayValue = result override var representedObject: Any? didSet / Update the view, if already loaded. Result.swift: / Result.swift / text7 / Created by wu on 2017/11/
7、9. / Copyright 2017 年 2015110445. All rights reserved. / import Foundation struct Operation private var accumulator: Double? /保存值 /枚举出特殊符号的计算方法 private enum Operations case constant(Double) /常量 case unaryOperation(Double) - Double) /一元运算 case binaryOperation(Double, Double) - Double)/二元运算 case equal
8、s /等于,输出结果 /特殊符号计算方法的具体实现 private var operations: Dictionary = “ “ : Operations.unaryOperation(sqrt), “cos“ : Operations.unaryOperation(cos), “sin“ : Operations.unaryOperation(sin), “+“ : Operations.binaryOperation( $0 + $1), “ : Operations.binaryOperation( $0 - $1), “ : Operations.binaryOperation(
9、$0 * $1), “ : Operations.binaryOperation( if $1 = 0 return 0 else return $0 / $1 ), “=“ : Operations.equals /准备进行二元运算 private struct PendingBinaryOperation let function: (Double, Double) - Double let firstOperan: Double func perform(with secondOperand: Double) - Double return function(firstOperan, s
10、econdOperand) /结构体实例,准备进行二元运算 private var pendingBinaryOperation: PendingBinaryOperation? mutating func performCalculation(symbol: String) if let operation = operationssymbol switch operation case .constant(let value): accumulator = value /常量直接设置值 case .unaryOperation(let function): if accumulator !
11、= nil accumulator = function(accumulator!) /一元运算计算后再设置值 case .binaryOperation(let function): if accumulator != nil pendingBinaryOperation = PendingBinaryOperation(function: function, firstOperan: accumulator!) /二元运算,先将第一次输入的数据和运算符保存,等待下一次输入 accumulator = nil case .equals: if pendingBinaryOperation !
12、= nil & accumulator != nil accumulator = pendingBinaryOperation?.perform(with: accumulator!) /等号,计算结果 pendingBinaryOperation = nil mutating func setOperand(operand: Double) accumulator = operand /设置运算值 var result: Double? return accumulator /返回结果 运行结果: 布局: 第一种布局: 1、 在 Main.stroyboard 中向界面拖三个 UIView
13、并设置各自的背景颜色 ; 2、 先选中三个视图,然后点击 Embed In Stack,将三个视图放入一个栈中 ; 3、 设置这个栈的参数 (Aligment 设置为 fill, Distribution 设置为 fill equally, spacing 设置为10) ; 4、 设置相应的约束,使 autolayout 能识别这三个视图组成的栈的对应位置。 在 Stack 上按下 control 键,并拖动鼠标指向 View,这时就会有相应的提示框弹出来设置约束,我们这里选择如下三个参数 :(Center Horizontally in Safe Area)设置 x 位置、 (Center
14、Vertically in Safe Area)设置 y 位置、 (Equal Widths)设置宽 ; 5、 选择 Aspect Ratio 尺寸比例 ; 6、 在右边的尺寸检查器中编辑该约束,将比 例设置为 1:1,也就是使高度和宽度相等。 如下: 第二种布局: 对中间三个视图进行布局 ,先将是三个视图放入栈中,设置间隙和填充方式,然后添加约束 1、 相对于 View的约束和 Stack自身的约束选择如下: 2、 编辑一下约束,设置高度为 50,相对于 View左边距为 10(Leading Space to Safe Area),相对于 View右边距为 -10(Trailing Space to Safe Area) 3、 进行上半部分两个视图的操作。 选中两个视图,然后放 入栈中,相应的参数更改如下: 4、 再设置与 View之间的约束、与中间三 个视图组成的 Stack 之间的约束