Swift iOS 10 學習筆記 – iPhone手機開發 iPhone軟體開發教學課程

Swift

常規

任何變量都要有初始值 switch case 不需要 break

Class vs Struct

class 可以繼承,struct不可以 class 使用時最終指向struct 本身,而struct是實例 如果struct中的一個方法要改變內容,需要在前面添加 mutating 關鍵字

enum

enum Operation{
    case constant( Double )                     //可以設置關聯值
    case unaryOperation( (Double) -> Double )
}

Tuple

let x: (String, Int, Double)  =  (“hello”, 5, 0.85)
let (word, number, value) = x
print(word)

let x: (w: String, n: Int, v: Double) = (“hello”, 5, 0.85)
print (x)

fun getLocation -> (x: Int, y: Int){
    return (120, 34)
}
let location = getLocation
print ( location.x )

Range

… ..< >…

let array = [1, 2, 3, 4]
let a = array [ 2…3 ] // [3, 4]
let b = array [ 2..<3 ] // [3]

for i in 1..<10 {}
stride
for i in stride (from: 1, through: 10, by: 0.2){}

Methods

func setValue(from firstPlace: Int, to secondPlace: Int) -> Bool {}

方法在聲明的時候,參數可能有內外兩個名字 省略某個參數名字用 _ 代替 如果隻留一個參數名,那麼這個名字既是內名字,也是外名字

Properties

var property: Int = 42{
willSet { newVlaue 是新值}
didSet { oldValue 是舊值}
}

可計算的變量

var recWidth: CGFloat {
    get { return bounds.size.width / 2 }
    set { recWidth = newValue }
}

// 如果隻需要 get 方法,就不需要寫外面的 get 瞭,像這樣
var recWidth: CGFloat {
    return bounds.size.width / 2
}

lazy

直到被用到時,才會被初始化

lazy var brain = CalculatorBrain()

Array

var a = Array()
var a = [String] ()

遍例

for animal in a {}

過濾元素

filter (includeElement: (T) -> Bool) -> [T]

let bigNumbers = [2, 34, 12, 45].filter({$0 > 20})

// 轉換元素
map(transform: (T) -> U) -> [U]
let stringified: [String] = [1, 2, 3].map({String($0)})   // [“1”, “2”, “3”]

Dictionary

var dict = Dictionary

遍例

for (key, value) in dict {}

String

遍例

for c: Character in s.Characters {}

// 字符數:人類識別的字符數
let count = s.characters.count

// 字符串中找哪個字符的位置
let firstSpace: String.Index = s.characters.index (of: “ ”)

// 字符可以加減
var greeting  = “hello”
greeting += “ there”
print ( greeting )   // “hello there”

var endIndex: String.Index 

func hasPrefix ( String ) -> Bool   //有前綴
func hasSuffix ( String ) -> Bool   //有後綴

其它類

NSObject
NSObject : Objective-C 的根類

Date

Data


Init

初始化方法

裡面可以重設 let 變量值 必須初始化裡面的所有變量 var let 有便捷初始化方法 和 直接初始化方法 兩種 直接初始化方法,必須調用分類的直接初始化方法 在調用父類初始化方法之前,必須初始化所有自定義的元素 在修改父類元素之前,必須先調用父類初始化方法

繼承

如果不使用任何 Init 方法,將繼承所有的

Any & AnyObject

if let vc = ViewController as? UIViewController {}

UserDefaults

是個小型的數據庫,一般用來存儲用戶設置,在啟動應用的時候就存在,不能放太大的東西。

func set ( Any? forKey: String )
func object ( forKey: String ) -> Any?

// 用法
let defaults = UserDefaults.standard        // 獲取UserDefaults

defaults.set ( “Kyle”, forKey: “name” )     // 設置值
defaults.set ( 25, forKey: “age” )
defaults.set ( “Kyle”, forKey: “name” )

func double( forKey: String ) -> Double     //獲取值
func array( forKey: String ) -> [Any]?

// 存儲
// 自動存儲的,如果想手動存儲
if !defaults.synchronize () {} 

Assertions
assert ( ()->Bool, “message” )          //如果返回false, 打印 Message

UI相關

CGFloat

let cgf = CGFloat(Double.pi)

CGSize

var cgs = CGSize(width: 200, height: 100)
cgs.width += 1
cgs.height += 5

CGPoint

var cgp = CGPoint(x: 4.5, y: 8.5)

CGRect

var cgr     = CGRect(origin: cgp, size: cgs)
var cgr_2   = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(60.0), height: CGFloat(35.0))

cgr.minX    // 最小x
cgr.minY    // 最小y
cgr.intersects(cgr_2)           // -> Bool 是否與第二個Rect相交
cgr.intersection(cgr_2)         //
//cgr.contains(point: CGPoint)  // 包含某個點
//cgr.contains(rect2: CGRect)   // 包含某個Rect

addSubview()

let ui  = UIView(frame: cgr)
ui.backgroundColor  = UIColor.brown    // CGColor

var ui2 = UIView(frame: cgr_2)
ui2.backgroundColor = UIColor.orange

ui.addSubview(ui2)


// 每個點有多少像素
ui.contentScaleFactor

// Frame & Bounds
ui.bounds       // 邊界,可旋轉
ui.frame        // 容器
ui.center

創建自己的 UIView

class MyUIView: UIView{
    override func draw(_ rect: CGRect) {
        self.drawPath()
    }
    func drawPath(){
        // 創建曲線對象
        let path = UIBezierPath()
        // 畫線
        path.move(to: CGPoint(x: 80, y: 50))
        path.addLine(to: CGPoint(x: 140, y: 150))
        path.addLine(to: CGPoint(x: 10, y: 150))
        // 關閉路徑
        path.close()

        UIColor.orange.setFill()    // UIColor 的方法
        UIColor.brown.setStroke()   // UIColor 的方法
        path.lineWidth = 5.0        // 設置曲線粗細

        path.fill()                 // UIBezierPath 的方法
        path.stroke()               // UIBezierPath 的方法
    }
}

let triPath = MyUIView()

讓自己創建的類能在 StoryBoard 中顯示並編輯

需要在類前面添加 @IBDesignable
在變量前面添加 @IBInspectable

@IBDesignable
class Face: UIView {

    @IBInspectable
    var scale: CGFloat = 0.9

    @IBInspectable
    var eyeOpen: Bool = false

    @IBInspectable
    var smileRatio: Double = -1.0 // 1.0 | -1.0
}

手勢

UINavigationController

rootViewController

操作MVC

var viewControllers: [UIViewController] ? { get set }

tab bar, 從左到右依次排列 split view, [0] 是主視圖, [1] 是詳細信息視圖 navigation controller, [0] 是根視圖

確定自己在哪個MVC中

var tabBarController:   UITabBarController? { get }
var splitViewController:    UISplitViewController? { get }
var navigationController:   UINavigationController? { get }

比如:要得到 split vc 的 detail vc 可以這樣獲取

if let detail: UIViewController? = splitViewController?.viewVontrollers[1]

Segues

一些Segues
- Show Segue
- Show Detail Segue
- Modal Segue
- Popover Segue

identifier

prepare segue

func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier{
        switch identifier {
            case "show graph":
                if let vc = segue.destinationViewController as? GraphController {
                    vc.property1 = ...
                }
            default: break
        }
    }
}

prepare 的時候,outlet 還是 nil

Life Cicle

awakeFromNib segue prepared outlets get set viewDidLoad
viewWillAppear viewVillDisappear viewWillLayoutSubviews()

override func viewDidLoad(){
    // outlet 已經準備好
    // prerare for segue 準備好
    // 但是 幾何 上還沒有準備好。 bounds 之類的
}

func viewWillAppear( _ animated: Bool ){
    // 更新 UI
    // 放一些真正要實現的東西 
}

func viewDidAppear ( _ animated: Bool ){
    // 開始動畫
}

func viewWillDisappear ( _ animated: Bool ){
    // 清理一些將不再顯示在屏幕上的內容
    // 不要做一些耗時的操作,不然會使應用遲頓
}

幾何學變化操作

func viewWillLayoutSubviews(){
    // 比如旋轉的時候 
}

func viewDidLayoutSubviews(){

}

    // 旋轉時的動畫
func viewWillTransition(
    to size: CGSize,
    with coordinator: UIViewControllerTransitionCoordinator
)
func awakeFromNib(){

}

內存管理 Memory Management

strong weak unowned

stong

default value

weak

only optional can be weak
如果沒人指向我,就把我設為 nil

unowned

發佈留言