Swift 学习日记 - 3(复习与程序相关)

diaryNum += 1          // 新的 Swift 去掉了 ++ 符号
print "Hello Again!"
print "Welcome to Swift Learning Diary " + String(diaryNum) + " !"

Welcome to Swift Learning Diary 3 !

点击进入 → Swift 学习日志 - 目录/相关资料

FollowLight 改进

print "Still that Silly!"

Still that Silly!


A new Start

虽说已经可以逐渐做一些小的增加和改动,但是对于基础的掌握依旧需要长时间的练习,一遍遍的训练和掌握。


使用书籍

「Swift 与 Cocoa 框架开发」


复习

2.1 - 2.5

  • Tuple,元组,将多个值捆绑到单个值中
  • 空数组,需要人工指定类型: Int
  • Dictionary, key to value. 不同类型也可以
  • 0 …< 10 // 0 到 10 不包含 10,for xx in xxxx
    0 … 10 // 0 到 10 包含10
  • **lf-let **语句用来检查一个可选变量是否包含值
  • 强大的 switch,根据 Tuple 进行切换,可以编写非常特别的 case,仅当其中一个组件与条件匹配时再进行

2.6

  • 定义函数可返回值时,需要用 “ -> ”
  • 函数仅可返回一个值,但是通过使用 Tuple,可以将多个值捆绑放入单个值中
  • 在参数名前面放入 “ # ” 号,使得内部名字和外部名字相同
  • 为函数单独命名了外部名字时,调用时***必须使用这个外部名称***
  • 可变参数,取值数目可变,使用方法像数组一样 (仅最有一个参数可以是可变参数)
    func sumNumber(numbers: Int…) -> Int { // Int 后面加 … 表示为可变参数
    var total = 0
    for number in numbers {
    total += numbers
    }
    return total }
  • inout,直接改变这个变量中储存的值。用一个函数交换两个变量。
    func swapValues(inout v1: Int, inout v2: Int) {// 交换两个数的位置}
    swapValues(&num1, &num2)
  • 通过让函数捕获一个值并多次使用,可以创建用作生成器的函数(每次调用时返回不同值的函数)

2.7

  • 闭包,内置 sorted 函数。可以接受参数,XCode 可以推断参数的类型,可以储存在变量中,调用方式与函数相同
  • 继承,包含被继承类(父类)的所有函数和属性,只能有一个父类(C++ 允许多重继承)。通过 override 可以重写父类中的函数,用 super.xxx 调用父类中的对应值。
  • 定义计算属性:同储存属性一样声明一个变量,在后面加入 { 与 }
  • 在属性发生变化时运行某些代码,向属性添加观察器,属性后面添加 { 与 },包含 willSet 和 didSet 代码块
  • 惰性属性:直到首次访问时才会设定,关键字 lazy
  • 定义协议:创建一个属性和方法清单,与类十分相似,但是不提供任何实际的代码,可以引用任何遵守某一给定协议的对象,这个类的具体类型久无关紧要了
  • 可以扩展任意类型,既可以扩展自己编写的 class,也可以扩展内置类型
    情况:向别人编写的 class 中添加功能,但不能访问其代码或不想浪费时间时
    情况:使用自己编写的 class,但希望将其功能划分到不同部分提高可读性时
  • extension 中只能增加计算属性,不能增加自己的储存属性
  • 将一个属性的 setter 声明为私有的,可以使这个属性只读,源文件可以随便读取改写,但其他文件只能读取值
  • 利用泛型可以将 class 的类型设为一个可变化参数,在之后的调用中任何类型都可以(class Tree<T> { })

2.8 - 2.End

  • Objective-C 中使用 Swift,在对象前面增加 @objc
  • Swift 中使用 Objective-C, #import
  • 苹果编写的书:Using Swift with Cocoa and Objective-C
  • 内存托管:使用时,放入内存中,不再需要时,从内存中删除。引用计数是 Swift 中用来跟踪对象是否还在使用的技术,将对象指定给变量时增加 1,不再指定减少 1,降到 0 时便从内存中删除
  • 需要留意的问题:循环引用,两个对象互相引用,但未被其他任何部分引用。
  • 弱引用来解决,一种变量,引用一个对象,不改变对象的引用计数(关键字 weak)
  • countElement 可以计算任意集合中的元素个数(数组,字典)
  • 数据模块:NSData
  • 遵循 NSObject 和 NSCoding 协议下,可以将对象转换为数据
  • 模型-视图-控制器:MVC
  • 将应用程序划分为责任区后,修改将变得更为轻松,通过明确定义哪些对象负责哪些功能,可以更轻松的修改应用并使项目结构保持清晰
  • 对象的委托

应用程序

  • Info.plist 非常重要
  • 通过 NSBundle,无论代码在哪里,应用程序都可以正常工作,代码通过这个类可以知道自己在磁盘上的位置以及如何获得编译后的资源

macOS 生命周期

  1. 首先打开 Info.plist,系统因而知道编译后的二进制文件在哪里并启动
  2. 接口对象:在设计时准备的,与应用成语一起打包的对——预先准备的窗口,控件和屏幕。存储在 nib 文件内部。
  3. 从 nib 文件解包一个对象时,会发送 awakeFromNib 消息,对象便可以运行代码。(向 nib 中添加对象时便被创建,保存 nib 时,对象被冷冻起来,在打开 nib 时,对象被唤醒,之后便会发送消息,让它知道此时状态已经清醒)
  4. 应用程序准备可以运行,向应用程序委托发送 applicationDidFinishLaunching 方法。
  5. 进行运行循环,监听一切发生的事情
  6. 当用户选择另一个 APP 时,收到 applicationWillResignActive 的消息,表示 APP 不再活动
  7. 收到 applicationDidResignActive 方法确认 APP 的确不再活动
    分开的原因:切换另一个 APP 时,代码可以继续控制屏幕内容的变化,再调用 Will 时,程序仍然在屏幕上,当不可见时,会收到 Did 方法
  8. 用户回归 APP 时,收到类似之前的方法,applicationWillBecomeActive 和 applicationDidBecomeActive
  9. 最终退出时(⌘Q),收到 applicationWillTerminate,最后一次保存文件的机会

iOS 生命周期

与 macOS 区别:

  • 屏幕一次只能显示一个程序
  • 电话,通知栏等会打断程序使之变为后台程序

生命周期基本相同

  • 程序完成加载后,增加的参数:Dictionary,包含了有关为什么启动程序以及如何启动(点击,分享,URL)
  • 关于 Resign 方法,macOS 上时 NSNotification 对象,而 iOS 上为 UIApplication

退出时的变化,多任务:

  • 按主屏幕按钮退出后,程序被挂起,停止执行代码,内存被锁定
  • 程序仍在内存中,没有退出但停止消耗 CPU 及其他硬件资源
  • 当开启的程序需要更多的内存时,程序被终止,不作任何通知
  • applicationWillEnterBackground 在程序被移到后台后立即被调用,程序应该在这个时候保存所有数据
  • applicationWillEnterForeground 在程序即将回到屏幕上之前被调用
  • 通过减少程序所用的内存(释放大的对象,卸载图像等)来降低被终止的可能性
  • 将内存降到 16MB 一下:低于这个量额程序会被存储在闪存中,从内存中彻底移出,当程序恢复时,再次从闪存芯片的存储内存中重新加载,因此,不会因为其他应用的内存需求而将程序从内存中去除
  • 程序可以申请在后台段时间运行,不超过 10 分钟,为了让程序完成一个需要长时间运行的过程(将大型文件写回磁盘,完成下载等),时间结束后,程序需要告诉 iOS 已完成或者将被终止(不是挂取)
  • 后台获取与后台通知的增加,需要专门开启,设定的最短间隔唤醒时间并不一定被 iOS 采纳,iOS 会有自己的机制来避免不必要的损耗
  • 音频类应用可以在后台持续播放;后台跟踪位置的应用可以运行任意长时间;网际协议电话(VoIP)可以定期运行

沙盒机制

  • iOS 中一定存在,无法抉择
  • macOS 之前可以选择,现在一定需要(mac app story 不接受非沙盒的,因此更多的开发商选择了官网直接发售而不是商家 MAS)

沙盒可以将系统级的文件被隔绝出来避免各种安全性的问题,哪怕软件用可以被利用的 bug,因为沙盒的限制,它依旧不能改变系统性的东西,所以杜绝了安全性的问题

  • 不可使用私有 API,只能使用文档中已经表明的