enum CompassPoint {
case north
case south
case east
case west
}
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
- 类:
恒等运算符:=== / !==
===:表示两个类类型的常量或者变量引用“同一个类的实例”
!==:表示两个类类型的常量或者变量没引用“同一个类的实例”
if tenEighty === alsoTenEighty {
print("tenEighty and alsoTenEighty refer to the same Resolution instance.")
}
//打印 "tenEighty and alsoTenEighty refer to the same Resolution instance."
class DataImporter {
/*
DataImporter 是一个负责将外部文件中的数据导入的类。 这个类的初始化会消耗不少时间。
*/
var fileName = "data.txt"
// 这里会提供数据导入功能 }
class DataManager {
lazy var importer = DataImporter() var data = [String]()
// 这里会提供数据管理功能
}
let manager = DataManager() manager.data.append("Some data") manager.data.append("Some more data")
// DataImporter 实例的 importer 属性还没有被创建
//由于使用了 lazy ,importer 属性只有在第一次被访问的时候才被创建。
print(manager.importer.fileName)
// DataImporter 实例的 importer 属性现在被创建了
// 输出 "data.txt”
struct AlternativeRect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / 2)
let centerY = origin.y + (size.height / 2)
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / 2)
origin.y = newValue.y - (size.height / 2)
}
} }
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0) print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") // 打印 "the volume of fourByFiveByTwo is 40.0"
- 属性观察器:
willSet:在新的值被设置之前调用
didSet:在新的值被设置之后立即调用
//计步器:
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("About to set totalSteps to \(newTotalSteps)")
}
didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
} }
} }
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
- 下标:subscript
在实例名称后面的方括号中传入一个或者多个索引值来对实例进行存取
subscript(index: Int) -> Int {
get {
// 返回一个适当的 Int 类型的值
}
set(newValue) {
// 执行适当的赋值操作
}
}
class Car: Vehicle {
var gear = 1
override var description: String {
return super.description + " in gear \(gear)"
}
}
- 防止重写:final
把方法,属性或下标标记为 来防止它们被重写
在关键字前加 final
final var,
final func,
final class,
final subscript,
enum TemperatureUnit {
case Kelvin, Celsius, Fahrenheit
init?(symbol: Character) {
switch symbol {
case "K":
self = .Kelvin
case "C":
self = .Celsius
case "F":
self = .Fahrenheit
default:
return nil
}
}
}
- 拓展:extension
为一个已有的类、结构体、枚举类型或者协议类型添加新功能
extension Double {
var km: Double { return self * 1_000.0 }
var m : Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// 打印 “One inch is 0.0254 meters”
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
// 打印 “Three feet is 0.914399970739201 meters”
- 协议:protocol
要让自定义类型遵循某个协议,在定义类型时,需要在类型名称后加上协议名称,中间以冒号( : )分隔。遵循 多个协议时,各协议之间用逗号( , )分隔
protocol SomeProtocol {
// 这里是协议的定义部分
}
struct SomeStructure: FirstProtocol, AnotherProtocol {
// 这里是结构体的定义部分
}
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
// 这里是类的定义部分
}
- 访问控制:open、public、internal、filepart、private。
1,private
private访问级别所修饰的属性或者方法只能在当前类里访问。
原文:Swift - 访问控制(fileprivate,private,internal,public,open)
2,fileprivate
fileprivate访问级别所修饰的属性或者方法在当前的Swift源文件里可以访问。(比如上门样例把private改成fileprivate就不会报错了)
3,internal(默认访问级别,internal修饰符可写可不写)
internal访问级别所修饰的属性或方法在源代码所在的整个模块都可以访问。
如果是框架或者库代码,则在整个框架内部都可以访问,框架由外部代码所引用时,则不可以访问。
如果是App代码,也是在整个App代码,也是在整个App内部可以访问。
4,public
可以被任何人访问。但其他module中不可以被override和继承,而在module内可以被override和继承。
5,open
可以被任何人使用,包括override和继承。
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_524.html