Xcode swift
简介
xcode开发笔记
app 进展
- how to overlay
tips
editor->canvas: 实时预览
// @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获取到了这个环境变量。
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? |
在声明一个变量时如果不手动初始化,Swift不会自动初始化该变量为一个默认值的。
var a : String |
但是对于Optional的变量则不同,Optional的变量在声明时如果不初始化,Swift会自动将该变量初始化为nil。声明变量时在类型后添加?或者!就是告诉编译器这个一个Optional的变量,如果没有初始化,你就将其初始化为nil
var a : String? //a 为nil |
但是这两者之间还是有一些区别的,介绍后面之后再讲。 Optional事实上是一个枚举类型,从下图可以看出,Optional包含None和Some两种类型,而nil就是Optional.None,非nil就是Optional.some。如果Optional变量在声明时不初始化,Swift会调用init()来初始化变量为nil,而用非nil的值初始化变量时,会通过Some(T)把该原始值包装,所以在之后使用的时候我们需要通过解包取出原始值才能使用。
2.在对变量操作时
number?.hashValue |
var arrayCount = dataList?.count |
这时问号的意思类似于isResponseToSelector,即如果变量是nil,则不能响应后面的方法,所以会直接返回nil。如果变量非nil,就会拆Some(T)的包,取出原始值执行后面的操作。
var arrayCount = dataList!.count |
这里的叹号和之前的问号则不同,这里表示我确定dataList一定是非nil的,所以直接拆包取出原始值进行处理。因此此处如果不小心让dataList为nil,程序就会crash掉。
*回到上面声明时?和!区别的问题上去* 声明变量时的?只是单纯的告诉Swift这是Optional的,如果没有初始化就默认为nil,而通过!声明,则之后对该变量操作的时候都会隐式的在操作前添加一个!。
总结
- 问号? a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
- 叹号! 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
extension 为特定的class struct 添加新特性