欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Swift iOS 10 学习笔记

程序员文章站 2022-07-28 19:46:40
Swift 常规 任何变量都要有初始值 switch case 不需要 break Class vs Struct class 可以继承,struct不可以 class...

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