10.其他主题

#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

转载于:https://my.oschina.net/u/2319073/blog/870203

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值