热门标签 | 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()

    }

}



推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Java SE从入门到放弃(三)的逻辑运算符详解
    本文详细介绍了Java SE中的逻辑运算符,包括逻辑运算符的操作和运算结果,以及与运算符的不同之处。通过代码演示,展示了逻辑运算符的使用方法和注意事项。文章以Java SE从入门到放弃(三)为背景,对逻辑运算符进行了深入的解析。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
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社区 版权所有