简介

xcode开发笔记

app 进展

  1. how to overlay

tips

editor->canvas: 实时预览

storyboard or swiftui

// @FetchRequest(entity: Drawing.entity(), sortDescriptors: []) var drawings: FetchedResults

// 通过使用 @State 修饰器我们可以关联出 View 的状态. SwiftUI 将会把使用过 @State 修饰器的属性存储到一个特殊的内存区域,并且这个区域和 View struct 是隔离的.

// 当 @State 装饰过的属性发生了变化,SwiftUI 会根据新的属性值重新创建视图

// 通过 @Binding 修饰器修饰后,属性变成了一个引用类型,传递变成了引用传递,这样父子视图的状态就能关联起来了。

// swift可以为特定的class, strut, enum或者protocol添加新的特性。当你没有权限对源代码进行改造的时候,此时可以通过extension来对类型进行扩展。extension有点类似于OC的类别 -- category,但稍微不同的是category有名字,而extension没有名字。

// Protocol是Swift中的一种自定义类型,可以使用protocol定义某种约定,而不是某一种类型

// 用 some 修饰后, 可以返回子类?, 不透明类型

// 我们在App.swift中创建了persistenceController

// 并通过调用.environment把值传递给了ContentView。

// ContentView中使用@Environment(.managedObjectContext) private var viewContext获取到了这个环境变量。

IMG_4375

An observable object is a custom object for your data that can be bound to a view from storage in SwiftUI’s environment. SwiftUI watches for any changes to observable objects that could affect a view, and displays the correct version of the view after a change.

swift

! ?

一般我们在一下两种情况下会遇到!和?的使用 1.声明变量时

var number :Int
var str : String

在声明一个变量时如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。

var a : String
var b = a //error:因为没有初始化a,a没有值

但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!就是告诉编译器这个一个Optional的变量,如果没有初始化,你就将其初始化为nil

var a : String?           //a 为nil
var b : String! //b 为nil
var a_test = a //a_test为nil
var b_test = b //b_test为nil

但是这两者之间还是有一些区别的,介绍后面之后再讲。 Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。

请输入图片描述

2.在对变量操作时

number?.hashValue
str!.hashValue
var arrayCount = dataList?.count

这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。

var arrayCount = dataList!.count

这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。

*回到上面声明时?和!区别的问题上去* 声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。

总结

  1. 问号? a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
  2. 叹号! a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加! b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理

其他

  • Swift语言并不是像C/C++,Java那样完全忽视空格,Swift对空格的使用有一定的要求,但是又不像Python对缩进的要求那么严格。

    在Swift中,运算符不能直接跟在变量或常量的后面。

  • let 用于定义常量,定义完后不能修改。

    var 用于定义变量,可以修改。

    swift可以自动识别属性类别。

  • 可选类型 ?与!

    var optionalInteger: Int?
    var optionalInteger: Optional<Int>
  • 字符串插值

    import Cocoa

    var varA = 20
    let constA = 100
    var varC:Float = 20.0

    var stringA = "\(varA) 乘于 \(constA) 等于 \(varC * 100)"
    print( stringA )

    20 乘于 100 等于 2000.0
  • 数组

    var someArray = [SomeType](repeating: InitialValue, count: NumbeOfElements)
  • 函数

    //example1
    import Cocoa

    func runoob(site: String) -> String {
    return (site)
    }
    print(runoob(site: "www.runoob.com"))

    //example2
    import Cocoa

    func minMax(array: [Int]) -> (min: Int, max: Int) {
    var currentMin = array[0]
    var currentMax = array[0]
    for value in array[1..<array.count] {
    if value < currentMin {
    currentMin = value
    } else if value > currentMax {
    currentMax = value
    }
    }
    return (currentMin, currentMax)
    }

    let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
    print("最小值为 \(bounds.min) ,最大值为 \(bounds.max)")

    //example3
    import Cocoa

    func pow(firstArg a: Int, secondArg b: Int) -> Int {
    var res = a
    for _ in 1..<b {
    res = res * a
    }
    print(res)
    return res
    }
    pow(firstArg:5, secondArg:3)
  • guard return/throw 判断先决条件

    guard let _ = ticket,ticket?.movieName == currentMovieName else {
    print("非此场电影")
    return
    }
    guard ticket?.TimeValid else {

    print("该票已过期")
    return
    }
    print("可以看电影了")

  • try

    • do catch
    • try? 返回一个可选类型(some or nil)
    • try! 遇到异常立刻crash
  • ?!

    • 声明变量

      • var a : String!
        //操作变量时会隐式的加!
      • ?

        var a : String?
        //操作变量时需要加!和?
    • 操作变量

      • ?

        var a = data?.count
        //如果data是nil,a是nil
        //如果data有值,就调用count
      • !

        var a = data!.count
        //确信data不是nil,如果是nil就会crash
  • sorted by 用法

  • extension 为特定的class struct 添加新特性