结构体和类之间最重要的区别之一是,当它们在代码中被传递时,结构体总是被 copy 的, 属于值传递,而类是通过引用传递的。结构体用于定义轻量级数据类型,不需要有像继承和类构造那样的能力,结构体可以处理不同类型的数据;
枚举类型使用位运算符赋初始值时,表示用于可复选的枚举属性,调用时使用 | 运算符protocol ExampleProtocol {
var simpleDescription: String { get }
func adjust()
}
{ get }作为协议的属性表明它是只读的,意味着该属性的值可以查看,但不能修改Storyboard add constraints
shift + All UI element —> click the Stack Button —> Attributes inspector set Spacing field —> Pin add constraint —> items of New Constraints
Aspect Ratio 设置View元素比例,一旦设置,便保持不变AnyObject:一种被描述为可以属于任何类对象的类型
as as! as?
as使用场合
(1)从派生类转换为基类,向上转型(upcasts)
class Animal {}
class Cat: Animal {}
let cat = Cat()
let animal = cat as Animal
(2)消除二义性,数值类型转换
let num1 = 42 as CGFloat
let num2 = 42 as Int
let num3 = 42.5 as Int
let num4 = (42 / 2) as Double
(3)switch 语句中进行模式匹配
如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同的情况下使用对应的类型进行相应的处理。
switch animal {
case let cat as Cat:
print("如果是Cat类型对象,则做相应处理")
case let dog as Dog:
print("如果是Dog类型对象,则做相应处理")
default: break
}
as!使用场合
向下转型(downcast)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
class Animal {}
class Cat: Animal {}
let animal :Animal = Cat()
let cat = animal as! Cat
as?使用场合
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值(optional),需要我们拆包使用。
由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("cat is not nil")
} else {
print("cat is nil")
}
-
failable Initializers (可失败构造器)
初始化失败后可能返回 nil
1)可以直接用条件判断语句使用可失败构造器来实例化对象
2)init初始化方法可以通过在init关键字后面加上?或!将其变为可失败初始化方法,这样就表示某对象的初始化方法会产生两种结果
3)可失败构造器/初始化方法解决了以前在Swift中只能通过工厂方法捕获构造或初始化失败情况的问题。比如,一个枚举,通过fromRaw工厂方法通过一 个原始值来寻找它所对应的枚举成员,返回类型为可选枚举类型。即如果该原始值对应的枚举成员存在,那么返回该枚举成员,如果不存在则返回nil。现 在,Swift编译器结合可失败构造器,通过可失败的初始化方法用switch语句判断原始值对应的枚举成员,如果没有对应的则返回nil:
enum Color : Int {
case Red = 0, Green = 1, Blue = 2// implicitly synthesized var rawValue: Int { /* returns raw value for current case */ } // implicitly synthesized init?(rawValue: Int) { switch rawValue { case 0: self = .Red case 1: self = .Green case 2: self = .Blue default: return nil } } }
Storyboard 布局 (给 UItableViewCell 添加界面元素时做参考 )
Editor —> Canvas —> Show Bounds Rectangles 使用蓝色矩形显示 UI 界面元素的 bounds,使得界面元素的局部排列更加容易
如果向 Cell 中添加的是 UIView,当添加的 UIView 不需要交互时,需要将 Attribute inspector 中的 interaction 项取消交互导航栏的背景会延伸到状态栏的顶部
判断数组:if array.isEmpty { return nil }