#10.1值和引用 值类型:结构,枚举,Int,String,将值类型传给方法时,将在内存中创建其副本,并传递其副本,方法可以随意修改它,不用担心原始值 引用类型:类,闭包,将闭包或对象传递给方法时,不会创建其副本,而是传递引用(内存地址)
##10.1.1引用循环
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运算符重载 (扩展运算符) 使用运算符重载可让自定义类或结构支持加减乘除等基本数学运算,方法是类或结构中重新定义这些运算符的行为
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相等和相同
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
对象相同性比较基于对象而不是类,即便两个变量指向的对象属于同一个类,只要他们指向的是不同的对象,也将被视为不同
#10.5Swift脚本编程 ##10.5.1创建脚本文件 打开Xcode->File->New->File->Other->Shell Script
###10.5.1运行脚本
./
./swiftScript.sh(文件名)
启动REPL命令
#!/usr/bin/env xcrun swift