#10.1值和引用 值类型:结构,枚举,Int,String,将值类型传给方法时,将在内存中建立其副本,并传递其副本,方法能够随意修改它,不用担忧原始值 引用类型:类,闭包,将闭包或对象传递给方法时,不会建立其副本,而是传递引用(内存地址)编程
##10.1.1引用循环swift
import UIKit class Letter{ let addressedTo : String // var mailbox : MailBox? weak var mailbox : MailBox?//弱引用断开引用循环 init(addressedTo : String) { self.addressedTo = addressedTo } deinit { //对象即将被释放,且该对象占用的内存被归还给系统前调用。 print("The letter addressed to \(addressedTo) is being discarded") } } class MailBox{ let poNumber : Int var letter : Letter? init(poNumber : Int) { self.poNumber = poNumber } deinit { print("P.O. Box \(poNumber) is going away") } } //闭包中的引用循环 class MailChecker{ let mailBox : MailBox let letter : Letter //lazy延迟属性 用于推迟属性的计算,直到属性在代码中被使用 lazy var whoseMail: () -> String = { [unowned self] in//让swift知道不该保留self对象,从而断开引用循环 return "Letter is addressed to \(self.letter.addressedTo)" } init(name : String) { self.mailBox = MailBox(poNumber : 311) self.letter = Letter(addressedTo : name) } deinit { print("class is being deinitialized") } } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.blue //test var firstClassLetter : Letter? var homeMailBox : MailBox? firstClassLetter = Letter(addressedTo : "John Prestigiacomo") homeMailBox = MailBox(poNumber : 335) //互相引用没法释放 firstClassLetter!.mailbox = homeMailBox homeMailBox!.letter = firstClassLetter //deinitialize the objects 若是为循环引用,设置为"nil",会调用"deinit"方法 firstClassLetter = nil homeMailBox = nil var checker : MailChecker? = MailChecker(name : "Mark daimeng") let result : String = checker!.whoseMail() print(result) checker = nil } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
#10.2逻辑运算符闭包
//逻辑非 var a : String = "pumpkin" var b : String = "watermelon" if !(a == b) { print("The strings don't match!") } //逻辑与 let c = true let d = true if c == true && d == true{ print("both are true!") } //逻辑或 let e = true let f = false if e == true || f == true{ print("one or the other is true!") } //泛型 func areValuesEuqal<T: Equatable>(value1: T,value2 : T) ->Bool{ return value1 == value2 } areValuesEuqal(value1: 1, value2: 2)//false areValuesEuqal(value1: "a", value2: "a")//true areValuesEuqal(value1: 3.12, value2: 3.12)//true
#10.3运算符重载 (扩展运算符) 使用运算符重载可以让自定义类或结构支持加减乘除等基本数学运算,方法是类或结构中从新定义这些运算符的行为ide
struct Matrix2x2{ var a11 = 0.0,a12 = 0.0 var a21 = 0.0,a22 = 0.0 } func + (left : Matrix2x2,right : Matrix2x2) -> Matrix2x2{ return Matrix2x2(a11:left.a11 + right.a11, a12:left.a12 + right.a12, a21:left.a21 + right.a21, a22:left.a22 + right.a22) } func * (left : Matrix2x2,right : Matrix2x2) -> Matrix2x2{ return Matrix2x2(a11:left.a11 * right.a11 + left.a12 * right.a21, a12:left.a11 * right.a12 + left.a12 * right.a22, a21:left.a21 * right.a11 + left.a12 * right.a21, a22:left.a21 * right.a12 + left.a22 * right.a22) } var A : Matrix2x2 = Matrix2x2(a11 : 1,a12 :3,a21: 5,a22 :6) var B : Matrix2x2 = Matrix2x2(a11 : 2,a12 :6,a21: 4,a22 :8) var C = A + B //3 9 9 14 var E : Matrix2x2 = Matrix2x2(a11 :2,a12 :3,a21 :1,a22:4) var F : Matrix2x2 = Matrix2x2(a11 :3,a12 :2,a21 :1,a22:-6) var G = E * F //9 -14 6 -22
#10.4相等和相同rest
class Test1{ } class Test2{ } var t1 : Test1 = Test1() var t2 : Test2 = Test2() var t3 : Test2 = Test2() var t4 = t2 t1 === t2 //false t2 === t3 //false t2,t3指向Test2的不一样实例 t4 === t2 //true t4 !== t2 //false
对象相同性比较基于对象而不是类,即使两个变量指向的对象属于同一个类,只要他们指向的是不一样的对象,也将被视为不一样code
#10.5Swift脚本编程 ##10.5.1建立脚本文件 打开Xcode->File->New->File->Other->Shell Script对象
###10.5.1运行脚本ip
./ ./swiftScript.sh(文件名)
启动REPL命令 #!/usr/bin/env xcrun swift