美文网首页
斯坦福 iOS c193p 课程学习收获

斯坦福 iOS c193p 课程学习收获

作者: csqingyang | 来源:发表于2020-07-20 00:21 被阅读0次

面试题: 设计并实现一个计算器
正常实现: 在控制器中实现大量的 switch 判断不同操作符.
但是计算相关的代码写到控制器里去, 如果计算一复杂, 控制器会多很多代码, 可读性和逻辑容易混乱, 控制器只应该负责把计算结果显示到相关的视图上去就行, 其他的事情应该交给专门的类去实现.
斯坦福教程中, 使用一个 CalculatorBrain 专门负责接收操作数, 执行运算, 返回结果.
定义属性和方法, accumulator 属性用来存储操作数以及计算结果, setOperand:方法用来接收操作数, performOperation:方法执行运算过程, result 只读属性返回计算结果:

class CalculatorBrain {
    
    var accumulator = 0.0
    
    func setOperand(operand: Double) { }
    
    func performOperation(symbol: String) {  }
    
    var result: Double {
        get {
            return accumulator
        }
    }
}

问题: 每次都要使用根据不同的运算符, 然后在 Switch 中去执行不同的运算.
改进: 使用枚举 Enum 来表示运算类型, 用 Dictionary 来表示和存储不同的运算类型对应的运算.

enum Operation {
    case Constrant(Double)
    case UnaryOperation((Double) -> Double)
    case BinaryOperation((Double, Double) -> Double)
    case Equals
}

该枚举将每一种运算类型对应到每一个枚举成员, 并给枚举成员设置关联值类型,常量运算关联了一个 Double 类型, 一元运算关联了一个 (Double)-> Double 类型的闭包,二元操作运算关联一个 (Double, Double) -> Double 类型的闭包, Equals 运算没有设置关联值类型.

定义一个字典存储不同的运算符以及对应的运算操作

var operations: Dictionary<String, Operation> = [
    "π": .Constrant(M_PI),
    "e": .Constrant(M_E),
    "√": Operation.UnaryOperation(sqrt),
    "cos": Operation.UnaryOperation(cos)
 ]

修改 performOperation 中的代码

func performOperation(symbol: String) {
    if let operation = operations[symbol] {
        switch operation {
        case .Constrant(let value): accumulator = value
        case .UnaryOperation(let function): accumulator = function(accumulator)
        default: break
        }
    }
}

在 Switch 语句中, 关联值可以被提取出来作为 switch 语句的一部分. 第一个 case: 关联值是一个 Double 类型的常量, 那么提取出来的关联值就是这个常量的值, 第二个 case: 关联值是一个 (Double) -> Double 类型的闭包, 那么提取出来的关联值就是这个闭包.

考察:
1 Swift 中枚举的使用
2 有简化代码逻辑的意识, 能及时优化自己的代码

follow-up
1 使用链式编程思想实现一个计算器
2 使用面向对象的方式实现一个计算器

相关文章

  • 斯坦福 iOS c193p 课程学习收获

    面试题: 设计并实现一个计算器正常实现: 在控制器中实现大量的 switch 判断不同操作符.但是计算相关的代码写...

  • Swift学习笔记2 - Views

    前言 这是斯坦福大学在线课程-Developing iOS 9 Apps with Swift 的学习内容,在iT...

  • iOS开发--MVC设计模式

    前言 最近一段时间在看斯坦福大学的iOS9视频课程,斯坦福老头在讲解MVC时我收获良多。参考Swift编程(四):...

  • 斯坦福 Swift学习笔记系列(二)

    这是学习swift的笔记系列,学习的课程是斯坦福 iOS11 swift语言。 学习swift的笔记(一):in...

  • 斯坦福iOS7 Lesson1

    学习了Ray的四个课程后,想重新巩固下自己的iOS知识,准备开坑斯坦福的iOS。最近出了iOS9的课程,大家可以去...

  • 斯坦福 Swift学习笔记系列(一)

    这是学习swift的笔记系列,学习的课程是斯坦福 iOS11 swift语言。 今天学习的是课程的第一集:int...

  • Ios开发站点和工具收集(部分自备天梯)

    Swfit 斯坦福大学iOS 9编程开发新课程 Programming ParadigmsProgramming ...

  • 《马上着手开发iOS应用程序》学习笔记

    今年九月份决定开始学习iOS开发。由于基础很差,一开始看斯坦福的iOS开发的课程进度非常缓慢,简单参考学习了Lea...

  • 1. 介绍

    本人在学习斯坦福大学的机器学习课程,特记录课程概要内容。课程地址: Andrew Ng机器学习课程 什么是机器学习...

  • iOS 相关

    # iOS相关 ### 1. wwdc (iOS新出的内容) ### 2. 网易公开课 斯坦福(学习视频) ###...

网友评论

      本文标题:斯坦福 iOS c193p 课程学习收获

      本文链接:https://www.haomeiwen.com/subject/ugngdttx.html