万象真经,y酷网,天南贡品是什么
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
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
iOS 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能
网友评论