4.对象和类(Objects and Classes)
1.同Java一致,使用class
和类名来创建一个类。
2.使用init
创建一个构造方法,使用deinit
创建一个析构方法,通过构造方法来初始化类实例。创建类实例同java一致,在类名后面加上()(实际是调用无参数的构造方法init(),构造方法也可以带参数)。使用.来访问实例的属性和方法。
- class NamedShape {
- var numberOfSides: Int = 0
- var name: String
- init(name: String) {
- self.name = name
- }
- func simpleDescription() -> String {
- return "A shape with \(numberOfSides) \(name) sides."
- }
- }
- var namedShape = NamedShape(name: "popkidorc")
- namedShape.simpleDescription()
3.子类的定义方法是在它们的类名后面加上父类的名字,用:分割。创建类的时候可以忽略父类。子类如果要重写父类的方法的话,需要用override
标记(与java不同,若没有添加override
就重写父类方法的话编译器会报错,编译器同样会检测override
标记的方法是否确实在父类中)。
- class Square: NamedShape {
- var sideLength: Double
- init(sideLength: Double, name: String) {
- self.sideLength = sideLength
- super.init(name: name)
- numberOfSides = 4
- }
- func area() -> Double {
- return sideLength * sideLength
- }
- override func simpleDescription() -> String {
- return "A square with sides of length \(sideLength)."
- }
- }
- let test = Square(sideLength: 5.2, name: "my test square")
- test.area()
- test.simpleDescription()
4.类的属性可以有getter和setter,如果不需要计算属性,但要在设置一个新值之前或之后运行一些代码,使用willSet
和didSet
。
- class EquilateralTriangle: NamedShape {
- var sideLength: Double = 0.0
- init(sideLength: Double, name: String) {
- self.sideLength = sideLength
- self.area = sideLength*1.732/2
- super.init(name: name)
- numberOfSides = 3
-
- }
- var perimeter: Double {
- get {
- return 3.0 * sideLength
- }
- set {
- sideLength = newValue / 3.0
- }
- }
- var area: Double {
- willSet{
- println("an new value \(newValue)")
- }
- }
- override func simpleDescription() -> String {
- return "An equilateral triagle with sides of length \(sideLength)."
- }
- }
- var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
- triangle.perimeter
- triangle.perimeter = 9.9
- triangle.sideLength
- triangle.perimeter
- triangle.area
5.方法的参数名除了第一个外,都需要在调用的时候显式说明。方法的参数名默认和它在方法内部的名字一样,也可以定义另一个名字,在方法内部使用。
- class Counter {
- var count: Int = 0
- func incrementBy(amount: Int, numberOfTimes times: Int) {
- count += amount * times
- }
- }
- var counter = Counter()
- counter.incrementBy(2, numberOfTimes: 7)
6.操作可选值变量时,可以再在操作(比如方法、属性和子脚本)之前加?。
如果?
之前的值是nil,
?
后面的东西都会被忽略,并且整个表达式返回nil
。否则,?
之后的东西都会被运行。在这两种情况下,整个表达式的值也是一个可选值。
- let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square")
- let sideLength = optionalSquare?.sideLength
5.枚举和结构(Enumerations and Structures)
1.使用enum
来创建一个枚举。和类一样,枚举可以包含方法。使用case声明枚举成员。
2.枚举的成员还可以设置默认值(当然可以不用设置,默认从0开始的整数,0、1、2),我们叫原始值,这些值的类型是相同的,并且设置了为第一个成员的原始值后,剩下成员的原始值会按照顺序赋值。通过toRaw
方法获取成员的原始值,fromRaw
方法尝试通过原始找到枚举成员(若找不到则为nil)。
- enum Rank: Int {
- case Ace = 1
- case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
- case Jack, Queen, King
- func simpleDescription() -> String {
- switch self {
- case .Ace:
- return "ace"
- case .Jack:
- return "jack"
- case .Queen:
- return "queen"
- case .King:
- return "king"
- default:
- return String(self.toRaw())
- }
- }
- }
- let ace = Rank.Ace
- let aceRawValue = ace.toRaw()
- if let convertedRank = Rank.fromRaw(1) {
- let threeDescription = convertedRank.simpleDescription()
- }
3.使用struct
来创建一个结构。结构和类有很多相同的地方,比如方法和构造器。它们之间最大的区别就是结构是传值,类是传引用。
- struct Card {
- var rank: Rank
- func simpleDescription() -> String {
- return "The \(rank.simpleDescription())"
- }
- }
- let threeOfSpades = Card(rank: .Three)
- let threeOfSpadesDescription = threeOfSpades.simpleDescription()
4.一个枚举的成员可以有实例值(也可以叫关联值)。相同枚举成员的实例值可能不同,创建枚举实例的时候传入。而在定义枚举时候设置的原始值对于所有实例都是相同的。
- enum ServerResponse {
- case Result(String, String)
- case Error(String)
- }
-
- let success = ServerResponse.Result("6:00 am", "8:09 pm")
- let failure = ServerResponse.Error("Out of cheese.")
-
- switch success {
- case let .Result(sunrise, sunset):
- let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
- case let .Error(error):
- let serverResponse = "Failure... \(error)"
- }
6.协议和扩展(Protocols and Extensions)
1.使用protocol
来声明一个协议,类似于java中的接口,为了和interface做为区别我们叫做协议。类、枚举和结构都可以实现协议(发现枚举实现协议协议中好像不能带有属性,希望大神指教)。
- protocol ExampleProtocol {
- var simpleDescription: String { get }
- mutating func adjust()
- }
- class SimpleClass: ExampleProtocol {
- var simpleDescription: String = "A very simple class."
- var anotherProperty: Int = 69105
- func adjust() {
- simpleDescription += " Now 100% adjusted."
- }
- }
- var a = SimpleClass()
- a.adjust()
- let aDescription = a.simpleDescription
-
- struct SimpleStructure: ExampleProtocol {
- var simpleDescription: String = "A simple structure"
- mutating func adjust() {
- simpleDescription += " (adjusted)"
- }
- }
- var b = SimpleStructure()
- b.adjust()
- let bDescription = b.simpleDescription
2.使用extension
来为现有的类型添加功能(称作扩展),比如添加一个计算属性的方法。可以使用扩展来给任意类型添加协议,甚至是你从外部库或者框架中导入的类型。
- extension Int: ExampleProtocol {
- var simpleDescription: String {
- return "The number \(self)"
- }
- mutating func adjust() {
- self += 42
- }
- }
- var i = 7;
- i.adjust()
- i.simpleDescription
- i
3.可以像使用其他命名类型一样使用协议名,可以创建一个有不同类型,但是都实现一个协议的对象集合。当处理类型是协议的值时,协议外定义的方法不可用。
- let protocolValue: ExampleProtocol = a
- protocolValue.simpleDescription
-
7.泛型(Generics)
1.在<>里写一个名字来创建一个泛型方法或者类型。 也可以创建泛型类、枚举和结构体。
- func repeat<T>(item: T, times: Int) -> [T] {
- var result = [T]()
- for i in 0..<times {
- result.append(item)
- }
- return result
- }
- repeat("knock", 4)
2.在类型名后面使用where
来指定一个需求列表,例如要限定实现一个协议的类型,需要限定两个类型要相同,或者限定一个类必须有一个特定的父类。简单起见,可以忽略where
,只在冒号后面写接口或者类名。<T: Equatable>
和<T where T: Equatable>
是等价的。
- func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> Bool {
- for lhsItem in lhs {
- for rhsItem in rhs {
- if lhsItem == rhsItem {
- return true
- }
- }
- }
- return false
- }
- anyCommonElements([1, 2, 3], [3,4])
-
- func anyCommonElementsNew <T, U, R where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element, R == T.Generator.Element> (lhs: T, rhs: U) -> [R] {
- var results = [R]()
- for lhsItem in lhs {
- for rhsItem in rhs {
- if lhsItem == rhsItem {
- results.append(lhsItem)
- }
- }
- }
- return results
- }
- anyCommonElementsNew(["1", "2", "3", "4"], ["3","4","6"])
原文地址:http://blog.csdn.net/ooppookid/article/details/40345557