美文网首页
<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开发 第一节课心得体

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