iOS最佳入门教程【斯坦福大学CS193P课程】学习笔记(1)

斯坦福大学CS193P课程的全部代码以及学习中遇到的问题

本系列文章主要内容:

  • 【斯坦福大学CS193P课程】的全部代码(分章节)
  • 记录学习此课程中遇到的一些问题
  • 分享该课程的高清视频&pdf资源(文尾)

1.一位大神对于这门课程的大力推荐

iOS行业领跑人——唐巧给出的建议.png
之前确实是看的这白胡子爷爷的这一系列视频入门,现在刚好重新回顾记录一下。


2.源代码部分: 因为涉及到storyboard的相关操作,所以将项目打包放在了文尾

项目结构.png

本章节功能:iOS版本的支持加减乘除、一元二元运算的计算器
最终效果.png

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
    CalculatorBrain.swift

//
// CalculatorBrain.swift
// Calculator
//
// Created by Alex LJ on 2017/3/5.
// Copyright © 2017年 Stanford University. All rights reserved.
//

import Foundation
enum Optional<T>{
case None
case Some(T)
}

func multiply(op1:Double,op2:Double)->Double{
return op1*op2
}
class CalculatorBrain
{

private var accumulator = 0.0
func setOperand(operand:Double) {
accumulator = operand
}
//操作类型 重点掌握这里的Swift特性 简易和类型推断
private var operations :Dictionary<String,Operation> = [
"π":Operation.Constant(M_PI),//M_PI
"e":Operation.Constant(M_E), //M_E
"±":Operation.UnaryOperation({ -$0 }), //minus
"√":Operation.UnaryOperation(sqrt), //sqrt
"cos": Operation.UnaryOperation(cos), //cos
"×":Operation.BinaryOperation({ $0 * $1 }),
"÷":Operation.BinaryOperation({ $0 / $1 }),
"+":Operation.BinaryOperation({ $0 + $1 }),
"−":Operation.BinaryOperation({ $0 - $1 })

]

enum Operation{
case Constant(Double) //常数
case UnaryOperation((Double)->Double) //单操作符 函数作为一个参数传值
case BinaryOperation((Double,Double)->Double) //双操作数
case Equals //等于
}

//执行运算操作
func performOperand(sympol:String){

if let operation = operations[sympol]{
switch operation {
case .Constant(let value):accumulator = value

case .UnaryOperation(let function): accumulator = function(accumulator)
case .BinaryOperation(let function):
excutePendingBinaryOperation()
pending = PendingBinaryOperationInfo(binaryFunction: function, firstOperand: accumulator)
case .Equals:
excutePendingBinaryOperation()

}
}

}

private func excutePendingBinaryOperation(){
if pending != nil {
accumulator = pending!.binaryFunction(pending!.firstOperand,accumulator)
pending = nil
}
}

private var pending: PendingBinaryOperationInfo?

private struct PendingBinaryOperationInfo{
var binaryFunction:(Double,Double)->Double
var firstOperand:Double


}
//运算结果
var result: Double{
get{
return accumulator
}
}
}
```

ViewController.swift
``` swift
//
// ViewController.swift
// Calculator
//
// Created by Alex LJ on 2017/3/4.
// Copyright © 2017年 Stanford University. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
//显示框
@IBOutlet private weak var display: UILabel!

var userIsInTheMiddleOfTyping = false
//点击数字后的执行函数
@IBAction private func touchDigit(_ sender: UIButton) {
let digit = sender.currentTitle!
if userIsInTheMiddleOfTyping {
let textCurrentlyInDisplay = display.text!

display.text = textCurrentlyInDisplay + digit

}else{
display.text = digit
}
userIsInTheMiddleOfTyping = true
}
//展示数值
private var disPlayValue:Double{
get{
return Double(display.text!)!
}
set{
display.text = String(newValue)
}
}
//brain实例
private var brain = CalculatorBrain()

//执行
@IBAction private func performOperation(_ sender: UIButton) {
if userIsInTheMiddleOfTyping{
brain.setOperand(operand: disPlayValue)
userIsInTheMiddleOfTyping = false
}
if let mathmathicalSymbol = sender.currentTitle{
brain.performOperand( sympol: mathmathicalSymbol)
}
disPlayValue = brain.result
}


}

3.遇到的困难

  • UI使用自适配时选择的一些处理需要十分仔细,极其容易出错,唯一的办法大概就是仔细重复观看视频。

4.完整项目地址打包下载方式

资料截图.png
参考:
1. 唐巧公众号文章原文
2.
Apple斯坦福大学CS193P课程(需梯子 不然很慢)

行文仓促,多有不足之处,若有错误、不当之处,还请斧正。

个人主页