美文网首页
<1>2016 斯坦福 iOS9开发 第一节课心得体

<1>2016 斯坦福 iOS9开发 第一节课心得体

作者: DoubleShawn | 来源:发表于2016-08-01 15:43 被阅读700次

教程中的视频:

http://www.bilibili.com/video/av4448848/

iTunes U 课程地址:iTunes U/Developing iOS 9 Apps Swift

CS193P 课程地址:CS193P iPhone Application Development

中文字幕文件:https://github.com/SwiftGGTeam/Developing-iOS-9-Apps-with-Swift

教程的介绍

工具Xcode 7 ,instruments

斯坦福的教程,不推荐新手直接上手学习,因为只有16节课的课时,教的内容仓促并且很快,再加上英语名词过多,不利于新手学习。而我的笔记呢,也会把简单内容过滤掉,更多突出的是老教授在传授编程方面的心得,还有就是从OC转swift中,两者的转换中我得到的体会,其次就是Swift的知识点。

适合人群

这篇教程适合人群:拥有OC的知识,并且想转学Swift的人群。

授课“老头”

可能你会在我的文章中“老头”的称呼,老头是这个视频的授课教授Paul Hegarty,斯坦福大学软件工程学教授,主要教授iOS应用的开发、编程可以正式称保罗教授。学生对保罗教授的热爱,我们更喜欢亲切的称呼保罗教授为“白胡子老头”,由于白胡子老头名字太长,所以文中出现的“老头”值得就是保罗教授。

什么是iOS

iOS的基础体系由Cocoa Touch,Media,Core Service ,Core OS组成。

Cocoa Touch:Multi-Touch Event、Alerts、Multi-Touch Controls、WebView、Accelerometer、People Picker、Localization、View Hierarchy、Image Picker、Camera。Cocoa Touch是让你能够触发屏幕事件的关键。

Media:Core Audio、Jpg Png Tiff、Open AL、Pdf、Audio Mixing、Core Animation、Video Playback、OpenGL ES

Core Service:Collections、Core Locations、Address Book、Net Service、Networking、Threading、File Access、Preferences、SQLite、URL Utilities

Core OS:Os X Kernel、Mach 3.0、BSD、Sockets、Security、Power Manager、Keychain、Certificates、File System、Bonjour

简单概括就是:

Cocoa Touch 接近用户,所有的View,VC,MapKit,动画

Media 音频视频。处理图片,OpenGL

Core Services 网络,线程,Sql (已经封装过的)

Core OS 接近硬件,基于Unix,多线程,文件管理,电量

第一节课做一个计算器:Calculator

使用的知识点,storyBoard的使用,基本函数的创建,基本对象的创建。

有两个重点:Let和Var的区别,和’?’(optional)和’!’(unwrap)的使用。

创建一个项目

首先创建一个项目,使用swift语言。

Controller视图控制器主程序介绍。

ViewController这是这个控制器的名字,但是这个名字不够具体。

UIViewController指的是我们这个控制器是继承于UIViewController的

这就是一个单继承的例子,其中class是一个类的关键字

class ViewController: UIViewController {

}

storyBoard的拖动

在storyBoard从控件库中拖动出UIButton,做成一个计算器的样子。

按住 control+鼠标左键 ,拖拉控件,可以在Controller文件中得到一个属性。

Connection中有两个常用的,第一个是Action,一个是OutLet。Action指的是方法,OutLet直接拖出来就是属性了。

Object 所属于ViewController这个控制器

name:方法或者属性的名字

Type:Button的Type有UIButton以及他所继承的所有类。这里选UIButton

Event:事件,事件的意思就是触发的条件,我们选择(Touch Up Inside)在上面点击。

Argument:这个选项可以知道我们需不需要有这个Button的参数。

拖拉出Action以后,会出现一个方法。

添加一个打印,来保证我们确实点击到了Button

@IBAction func  touchDigit(sender:UIButton) {

print("点击到了")

}

print

打印已经发生改变,已经不再是NSLog了

此时先打印,确定我们点击到了且调用了方法,在swift2.0以后,println这个方法已经被取消了,所以有些老资料里面会出现,现在不能这么做了,只能用print

我们注意到,在swift里面,可以用回车换行来决定一行代码的结束。在OC里面只能用‘;’来决定。当然如果swift用了‘;’也不会有错误。

函数的改动

func是添加一个方法的关键字;touchDigit是方法名字(括号里面是一个叫做sender的参数,类型是UiButton)

注意一个地方code规范上OC和Swift上有一个区别,在swift里面,第一个参数可以不写参数名字,

但是除了第一个以外的所有参数,都需要写参数名字,比如otherArgument: 5(如果第一个也写了会报错)

func touchDigit(sender:UIButton, otherArgument :Int) {

}

// 正确写法

self.touchDigit(somebutton, otherArgument: 5)

// 错误的写法

self.touchDigit(sender: somebutton, otherArgument: 5)

查看文档

接着玩下学,我们已经把每一个按钮的点击事件都获取到了,但是我们如何知道,我们点击的是哪一个Button呢?

所以老头带着我们查看了文档,通过查看了文档,我们知道Button里面有一个属性,能够知道button上的当前title内容。

老头教了一个Option+左键,在底层有查看文档的方法。

(注意到一个String?可能是一个字符串,我们希望他是一个String类型,这个我们稍后会具体讲解。)

好的,既然知道了当前Button的title(也是就计算器里面的1,2,3,4,5...)

那我们就能知道当前点击的Button是哪一个了。

let digit = sender.currentTitle 

此时我们注意到letdigit ,我们声明digit的时候有两种方法,Var 和Let

Var 和 Let 的区别

 let一般用来做常量,var用作变量。并且 let必须一次性精确赋值,不可再改变。

创建一个对象如果直接调用,创建后不改变值,会有一个善意的警告:was never mutated consider changing to 'let' constant。

如果变量不需要可变,那么尽量从var改为let,从而获得更好的性能。

大多时候都可以用Var啊,为什么要弄出一个Let呢?为什么Apple公司要这么做呢?

老头给出了三个观点

原因1:用Let时候,可以帮助别人阅读你代码的时候,不需要担心这个变量会发生变化。

原因2:用Let可以创建只读的数组或者是字典。(ps:和OC里面使用readOnly有点类似)

原因3:保护性十足。使用常量的时候一定只能用let。

为什么只用给Let或者Var就能代表一切的对象

申明了一个局部变量,确定了String类型,但是swift会根据后面的类型,来判断被赋值的对象,应该给一个什么样的值给他。

下面是标准的写法,也可以这么写,但是这有点像强转了。

let digit2:String = sender.currentTitle!;

所以我们让swift来推断他的类型,Swift也做到了。这样让代码非常简洁(Elegant Code),对象方法也更不容易出错。

‘?’和‘!’的相关介绍

在上述的字符串中,我们发现出现了一个 var currentTitle: String? { get }这么一个属性。

而这个‘?’是什么鬼。

首先‘?’的意思是:optional(可选类型),‘!’的意思是unwarp (解包)。

在swift有一个非常及其重要的特性,叫optional(可选类型),optional只有两种情况,一种是被赋值,一种是没有被赋值(即nil)

如果有被赋值的情况下,这个关联值,可以是任何类型的。(在swift底层封装的时候,任何东西都可以是optional不只是对象和指针,也可以是int,double类型)

上述有个‘?’,这里的意思就是:这个关联值为String的optional。也叫optional String(可选字符串)

注意所以这不是一个String类型,我们习惯说是类型是optional类型,而这个optional的关联值为String。

为什么要这么定义呢。因为这个button可能只是一个图片,不会被赋title的值,所以它可以表示没有被赋值的情况。

我们注意到最后有一个‘!’,感叹号是用来解包(unwarp)这个optional,相当于强转。

什么时候用‘!’号呢,就是我们程序员认为,这个类绝壁不会为空的时候。

用‘!’的会有风险的,一旦sender.currentTitle没有值,他就会unwarp一个没有被赋值的optional,直接就会崩溃。

所以有些人从来不用‘!’,因为可能这会让你崩溃。

但是老头说这是好事,会让你找到bug。因为没有赋值的话,会发生一些预期之外的事情,就算他没有崩溃,也会让你的需求发生改变。

我这里只说明了怎么去使用,怎么没有给大家讲述原理,原理略显繁杂,可以看看下面这篇文章。猫神钦点的。我是滋兹的。

《Swift中的问号?和感叹号!》的原理和具体说明。

http://letsswift.com/2014/06/swift-questionmark-exclamatorymark/

课堂提问:为什么Swift 不直接用空字符?或者一个指针,一个不占内存的地址,类似的东西去表示。

answer:在Swift里面的指针,是看不见的内存地址,不能让他为0,他对你是隐藏的。

比如说对于一个 optional int 他到底是1,还是0,还是别的,他不知道应该是什么。

再拖一个Label做显示

此时我们从Ib图形中,拖动出一个Label,OutLet (作为这个类的一个实例变量)

此时会发现,和OC是一样的,有一个weak的图标

为什么会用weak,我们第三节课会具体讲到。

能发现最后又一个unwarp的感叹号。

@IBOutlet weak var display: UILabel!  

如果是Xib文件拖出来的对象,一定能保证这个这个属性是存在而且不为0的,所以系统可以unwarp解包。

(这个Label的名字叫display)

let textCurrentInDisplay = display.text!

display.text =  textCurrentInDisplay + digit!;

定义一个基本属性

这样我们Button点击的时候就显示上去了。但是我们发现,如果为0的时候,会出现 0543的情况。

所以需要带上一个去判断有没有0.

var userIsInMiddleOfTyping :Bool = false

这个bool对象的名字叫 userIsInMiddleOfTyping 真够长的,老头说了,长不要紧,主要是要易读。

注意在定义对象的时候,如果没有用‘?’(optional)的话,一定要赋值,比如我们下面这样定义就会出错。

var userIsInMiddleOfTyping :Bool   // (这是错误的,会报错)

此时会出现一个错误, class  XXX has no initializers

他的意思是,我们生成一个变量的时候,必须赋值。不能得到一个未初始化的变量。

有两种方法解决这个错误:

1.对他进行初始化。

2.直接给他一个值

比如:var userIsInMiddleOfTyping :Bool = false

提问:那为什么optional的属性却没有这个报错呢?也没对他进行初始化啊

回答:因为optional是很特殊的,他们会一开始就自动被初始化为空。

大概就是这样的,@IBOutlet weak var display: UILabel = nil

var userIsInMiddleOfTyping :Bool = false 既然swift知道你是 false 了,也就是可以这么写

var userIsInMiddleOfTyping :Bool = false

所以最终版本就是这个了。

第一节课的最终版本

```

// 最后在计算器里面添加了一个π,

//老实说,我第一次见在if判断语句中添加一个赋值,感觉这么做没有必要。

@IBActionfuncperformOpration(sender:UIButton) {

userIsInMiddleOfTyping=false

ifletmathematicalSymbol = sender.currentTitle{

ifmathematicalSymbol =="π"{

display.text=String(M_PI)

}

}

}

@IBAction func touchDigit(sender: UIButton) {

let digit = sender.currentTitle

ifuserIsInMiddleOfTyping

{

lettextCurrentInDisplay =display.text!

display.text=  textCurrentInDisplay + digit!;

}else

{

display.text= digit;

}

userIsInMiddleOfTyping=true

}

```

这样我们由简单的一个小例子,得到了一门语言最基本的使用。

能实现点击事件,并且能够有反馈,学习到了Swift的基本知识,希望大家拍砖,多多支持。

相关文章

  • <1>2016 斯坦福 iOS9开发 第一节课心得体

    教程中的视频: http://www.bilibili.com/video/av4448848/ iTunes U...

  • [iOS] 开发技巧 <1>

    最好的iOS开发技巧和窍门-Medium iOS中的图片使用方式、内存对比和最佳实践

  • <1>

    2018.5 首都机场 夜晚的首都也是那么彻夜通明,没有白天黑夜之分,机场更是人来人往,行色匆匆,接打电话专注自己...

  • Spring开发环境配置<1>

    IntelliJ-IDEA教程gradle官网spring下载使用IDEA和gradle搭建Spring MVC和...

  • 星河<1>

    街边高大的梧桐,舒展开嫩绿的手掌。阳光欢快地跳过,轻轻着陆。在这样的日子里…… “啊啊啊啊!” 高中开...

  • iOS-Https适配

    在WWDC2016公告中,苹果建议开发商尽快使用ATS协议。该协议是iOS9和macOS (OS X) 10.11...

  • iOS开发--MVC设计模式

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

  • 项目开发笔记<1>:MAVEN建站

    优秀文章 博客:shu_lin > 使用maven创建web项目水滴娃娃 > 如何用Maven创建web项目(具体...

  • 小让情书 <1>

    1、 来不及送你一程 来不及问你, 什么算永恒。 2、 千秋山河如诗画, 不及你, 笑靥如花。 3、 瀚朗星空, ...

  • Rxjava介绍<1>

    Rxjava github地址给初学者的RxJava2.0教程------水管系列手把手教你使用 RxJava 2...

网友评论

      本文标题:<1>2016 斯坦福 iOS9开发 第一节课心得体

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