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 vs Struct
class 可以继承,struct不可以 class 使用时最终指向struct 本身,而struct是实例 如果struct中的一个方法要改变内容,需要在前面添加 mutating 关键字
enum
enum
enum Operation{ case constant( Double ) //可以设置关联值 case unaryOperation( (Double) -> Double ) }
Tuple
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
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
Methods
func setValue(from firstPlace: Int, to secondPlace: Int) -> Bool {}
方法在声明的时候,参数可能有内外两个名字 省略某个参数名字用 _ 代替 如果只留一个参数名,那么这个名字既是内名字,也是外名字
Properties
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
直到被用到时,才会被初始化
lazy var brain = CalculatorBrain()
Array
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
Dictionary
var dict = Dictionary
遍例
遍例
for (key, value) in dict {}
String
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
Date
Data
Data
Init
Init
初始化方法
里面可以重设 let 变量值 必须初始化里面的所有变量 var let 有便捷初始化方法 和 直接初始化方法 两种 直接初始化方法,必须调用分类的直接初始化方法 在调用父类初始化方法之前,必须初始化所有自定义的元素 在修改父类元素之前,必须先调用父类初始化方法
继承
继承
如果不使用任何 Init 方法,将继承所有的
Any & AnyObject
Any & AnyObject
if let vc = ViewController as? UIViewController {}
UserDefaults
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相关
UI相关
CGFloat
CGFloat
let cgf = CGFloat(Double.pi)
CGSize
CGSize
var cgs = CGSize(width: 200, height: 100) cgs.width += 1 cgs.height += 5
CGPoint
CGPoint
var cgp = CGPoint(x: 4.5, y: 8.5)
CGRect
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()
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
创建自己的 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 中显示并编辑
让自己创建的类能在 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
UINavigationController
rootViewController
操作MVC
操作MVC
var viewControllers: [UIViewController] ? { get set }
tab bar, 从左到右依次排列 split view, [0] 是主视图, [1] 是详细信息视图 navigation controller, [0] 是根视图
确定自己在哪个MVC中
确定自己在哪个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
一些Segues
- Show Segue
- Show Detail Segue
- Modal Segue
- Popover Segue
identifier
identifier
prepare segue
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
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
内存管理 Memory Management
strong weak unowned
stong
stong
default value
weak
weak
only optional can be weak
如果没人指向我,就把我设为 nil
unowned
unowned