热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

swift基础问题,求指教

诶之前就在这边问过很基础的问题,现在继续=。=上到第三课结束的地方了,为了和课程同步,环境还是xcode6.1.1然后代码这边的话遵循课程中说到的MVC,编译成功了,编译

诶之前就在这边问过很基础的问题,现在继续=。=
上到第三课结束的地方了,为了和课程同步,环境还是xcode 6.1.1

然后代码这边的话遵循课程中说到的MVC,编译成功了,编译过程并没有报错,但是在模拟器中打开了这个app之后就跳回来了显示了如下图的问题。
(请忽略我的神经病文风的注释,因为也是跟着视频一点一点打的代码,理解都写在注释里了)

跟着视频敲的代码,实在是找不到什么问题。错误信息也不是很看的明白那个(lldb)
整块代码是这样的:
谢谢了!T T

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import Foundation

//不要任何关于UI的内容,因为这里是model



class CalculatorBrain

{

    //首先创建一个类型为op的数组,这个数组会在下面的enum op中定义,然后将其实例化为opstack

    private var opStack = [Op]()

   

    //枚举三种情况,这三种情况

    private enum Op

    {

        case Operand(Double)//一个数

        case UnaryOpertaion(String, Double -> Double)//一个运算符和一个数的运算(运算为一个函数,参数是double,类型也是double)

        case BinaryOpertaion(String, (Double,Double) -> Double)//一个运算符和两个数的运算(运算为一个函数,参数是两个double,类型是double)

    }

   

    //创建一个字典,对应数值和运算方法。

    private var knownOps = [String:Op]()

   

    /*初始化时,先给好knownOps的值,分别为,

    x:BinaryOpertaion,

    ÷:BinaryOpertaion,

    +:BinaryOpertaion,

    -:BinaryOpertaion,

    √:UnaryOpertaion*/

    init()

    {

        knownOps["×"] = Op.BinaryOpertaion("×", *)

        knownOps["÷"] = Op.BinaryOpertaion("÷"){ $1 / $0 }

        knownOps["+"] = Op.BinaryOpertaion("+", +)

        knownOps["-"] = Op.BinaryOpertaion("-"){ $1 - $0 }

        knownOps["√"] = Op.UnaryOpertaion("√"){ sqrt($0) }

    }

   

    let brain = CalculatorBrain()

   

    func pushOperand(operand: Double ) -> Double? //输入一个数,没有运算

    {

        opStack.append(Op.Operand(operand))//如果这仅仅是一个数,那就作为Op.Operand类型传入

        println(Op.Operand(operand))//类似于opstack[x]的这种感觉

        return evaluate()

    }

   

    func evaluate() -> Double?{//为什么double要用optional?其实这个还不是很明白。

        //这是evalaute的起始位置,上面的evaluate都是从这里开始的。

        let(result, remainder) = evaluate(opStack)

        return result

    }

   

    private func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op])//输出的东西叫做tuple,算是一个好几个数据的小组合吧,类似于dictionary

    {

        if !ops.isEmpty{//如果ops不是空的

            var remainingOps = ops //因为ops是作为参数传入的,传入之后默认的就是一个只读的变量,所以要再赋值给一个可变的变量

            let op = remainingOps.removeLast()//这样就可以读取最后的那个元素了。那个原始还是一个op类型的东东。

            switch op

            {//下面我们来看看这这个元素是什么

            case .Operand(let operand)://如果是一个数字,这个operand就是同时传过来的那个数,相当于enum中的Op.Operand(let operand)

                return (operand, remainingOps)//输出一个数字和剩下的栈

            case .UnaryOpertaion(_, let operation)://如果是一个一元操作符,情况会稍微复杂一些

                let operandEvaluation = evaluate(remainingOps)//看来我们需要对operandEvaluation

                if let operand = operandEvaluation.result{//那我们就去看下

                    return (operation(operand), operandEvaluation.remainingOps)

                }

            case .BinaryOpertaion(_, let operation):

                let op1Evaluation = evaluate(remainingOps)

                if let operand1 = op1Evaluation.result{

                    let op2Evaluation = evaluate(op1Evaluation.remainingOps)

                    if let operand2 = op2Evaluation.result{

                        return (operation(operand1,operand2),op2Evaluation.remainingOps)

                    }

                }

            }

        }

        return (nil, ops)//如果栈中什么都不剩了,那就返回一个nil,所以返回值

       

    }



    func performOperaction(symbol: String) ->Double?

    {

        if let operation = knownOps[symbol]//operation是一个optional op的类型,所以,这个赋值可以作为一个条件判断。当值为nil的时候,那if就是false,否则if的条件为true

        {

            opStack.append(operation)

        }

        return evaluate()

    }

}



推荐阅读
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在工业过程控制系统中,由于被控对象的环境比较恶劣,干扰源比较多,仪器、仪表采集的信息常会受到干扰,所以在模拟系统中,为了消除干扰,常采用RC滤波电路,而在由工业控制计算机组成的自动 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 文章目录Golang定时器Timer和Tickertime.Timertime.NewTimer()实例time.AfterFunctime.Tickertime.NewTicke ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 2022年7月20日:关键数据与市场动态分析
    2022年7月20日,本文对当日的关键数据和市场动态进行了深入分析。主要内容包括:1. 关键数据的解读与趋势分析;2. 市场动态的变化及其对投资策略的影响;3. 相关经济指标的评估。通过这些分析,帮助读者更好地理解当前市场环境,为决策提供参考。 ... [详细]
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 本文详细解析了Java类加载系统的父子委托机制。在Java程序中,.java源代码文件编译后会生成对应的.class字节码文件,这些字节码文件需要通过类加载器(ClassLoader)进行加载。ClassLoader采用双亲委派模型,确保类的加载过程既高效又安全,避免了类的重复加载和潜在的安全风险。该机制在Java虚拟机中扮演着至关重要的角色,确保了类加载的一致性和可靠性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
author-avatar
中科蓝天李跃华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有