当前位置: 移动技术网 > IT编程>移动开发>IOS > Swift iOS 10 学习笔记

Swift iOS 10 学习笔记

2018年02月18日  | 移动技术网IT编程  | 我要评论

万象真经,y酷网,天南贡品是什么

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网