關(guān)鍵字inout
這個例子是在playground下寫的
// 聲明2個變量
var x = 3
var y = 5
// 聲明一個函數(shù),函數(shù)的形參接收2個inout關(guān)鍵字標(biāo)識的變量,可以理解是2個地址
func demo(inout X x:Int ,inout Y y:Int){
// 打印改變前的值,3,5
print(x,y)
// 賦值
x = y
// 打印改變后的值,5,5
print(x,y)
}
// 調(diào)用方法 傳入2個結(jié)構(gòu)體變量的地址
demo(X: &x, Y: &y)
// 打印在函數(shù)外邊的2個結(jié)構(gòu)體變量 5 5
print(x,y)
inout這個形參接收的相當(dāng)于接收的是結(jié)構(gòu)體變量的地址,所以根據(jù)地址在函數(shù)內(nèi)部改變的值,在外部也會發(fā)生變化
函數(shù)的類型
舉例:
func demo3(){
print("呵呵");
}
let d = demo3
上面這個類型函數(shù)的類型就是() -> ()
func demo1( let name name : String ,let age:Int){
print("\(name)\(age)")
}
上面這個類型函數(shù)的類型就是(String, Int) -> ()
函數(shù)的形參類型是函數(shù)類型,例:
func demo4(let test:()->()){
test()
}
形參test的類型為() -> ()
的函數(shù)類型,能夠接收一個 形參返回值都為空得函數(shù)
函數(shù)的返回值類型是函數(shù)類型,例:
// 定義一個函數(shù) 這個函數(shù)的返回值是一個以String類型為形參,無返回值的函數(shù).
func demo5()->((String)->()){
// 定義一個 形參String無返回值的函數(shù)
func test(let str :String){
print(str);
}
return test
}
// 定義一個函數(shù)變量來接收函數(shù),是一個接收字符串形參無返回值的函數(shù)
var t = demo5()
調(diào)用
t("IOS")
返回值是一個String -> ()
類型的函數(shù)
枚舉:rawValue
可以獲取枚舉的原始值用法,枚舉類型.枚舉值.rawValue
枚舉:init(rawValue:)
可以根據(jù)原始值用來找到對應(yīng)的枚舉如:枚舉類型(rawValue:3)
延遲加載 :lazy
例子:
class Dog: Animal {
var name:String?
var age:Int!
let color:String = "棕色"
lazy var id:Int = Int()
convenience init(name:String, age:Int){
self.init()
self.name = name;
self.age = age;
}
override func run() {
super.run()
print("狗跑")
}
}
lazy var id:Int = Int()
, lazy所標(biāo)記的屬性只有在第一次調(diào)用的時候才會計(jì)算初始值
計(jì)算屬性
可以通過變量的其他屬性經(jīng)過計(jì)算獲取到值,而本身當(dāng)賦值的時候也不會儲存而是拆開賦值給其他屬性
struct Square {
var size :CGSize {
// get 是簡潔 getter 方法,可以.語法訪問.
get{
return CGSize(width: self.long, height: self.wide)
}
// set 是簡潔 setter 方法,如果括號中不定義參數(shù)名的話可以使用newValue這個參數(shù)來獲取值.
set(newSize){
self.long = newSize.width
self.wide = newSize.height
}
}
var long:CGFloat = 0;
var wide:CGFloat = 0;
}
屬性監(jiān)視器
屬性監(jiān)視器willSet
和didSet
可以通過新舊值的變化來進(jìn)行一些判斷,和需求實(shí)現(xiàn).
實(shí)例:
struct Square {
var size :CGSize {
// get 是簡潔 getter 方法,可以.語法訪問.
get{
return CGSize(width: self.long, height: self.wide)
}
// set 是簡潔 setter 方法,如果括號中不定義參數(shù)名的話可以使用newValue這個參數(shù)來獲取值.
set(newSize){
self.long = newSize.width
self.wide = newSize.height
}
}
var long:CGFloat = 0{
// 在willset 也可以willset( ) 指定新值的變量名
willSet{
if(newValue < self.long){
print("減少了\(newValue - self.long )")
}
}
// 在didSet 也可以didSet( ) 指定舊值的變量名
didSet{
if(oldValue < self.long){
print("增加了\(self.long - oldValue)")
}
}
}
var wide:CGFloat = 0;
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
var sq = Square();
sq.long = 30;
sq.wide = 20 ;
print(sq.size)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
打印的結(jié)果
增加了30.0
(30.0, 20.0)
注意的是:屬性監(jiān)視器只有在屬性變化時才會調(diào)用不會去判斷這個值是否相等.初始化的時候不會調(diào)用.
靜態(tài)量,與類屬性 static 與 class
static
靜態(tài)變量 靜態(tài)常量聲明的關(guān)鍵字,可以寫在類中,也可以寫在結(jié)構(gòu)體中,作用域?yàn)楫?dāng)前類,可以直接通過結(jié)構(gòu)體名稱+.語法使用,也可以用類名+.語法使用,亦或者通過類屬性調(diào)用.
class
類屬性關(guān)鍵字,格式: class var demo:Int{ ... }
在括弧中,可以使用在相同文件下的結(jié)構(gòu)體名稱調(diào)用靜態(tài)屬性來使用.
例子:
// 結(jié)構(gòu)體中有一個靜態(tài)變量
struct Type {
static var type:Int = 0;
}
class Test: NSObject {
// 類屬性 指定set get,調(diào)用結(jié)構(gòu)體中的靜態(tài)值
class var t:Int {
set{
Type.type = newValue;
}
get{
return Type.type;
}
}
}
使用代碼
Type.type = 3;
print(Type.type)
Test.t = 5;
print(Type.type);
print(Test.t)
輸出結(jié)果:3 5 5
函數(shù)的外部參數(shù)名與內(nèi)部參數(shù)名
func demo( name : String,age:Int ){
}
以上這段代碼,name
是一個內(nèi)部參數(shù)名,而age即是內(nèi)部參數(shù)名也是外部參數(shù)名,在函數(shù)中第一個形參的外部名稱是省略的當(dāng)然,我們可以加上一個外部參數(shù)名,并且改寫第二個參數(shù)的內(nèi)部參數(shù)名如下:
func demo( name s1 : String,age s2 :Int ){
}
類方法,靜態(tài)方法
與OC一樣,swift也提供了類方法的實(shí)現(xiàn),并且在結(jié)構(gòu)體和枚舉上也實(shí)現(xiàn)了靜態(tài)方法(類型方法)的調(diào)用.
類方法聲明在func
前寫上class
,而類型方法前面寫上static
.
腳本屬性:subscript
附屬腳本允許你通過在實(shí)例后?面的?方括號中傳?入?一個或者多個的索引值來對實(shí)例進(jìn)?行訪問和賦值
subscript(x:CGFloat)->CGFloat{
return x * self.long;
}
防止重寫的關(guān)鍵字final
在對象方法,類方法,屬性,以及腳本屬性前面如果加上了final
他得子類就不可以重寫父類的方法,屬性.
弱引用的關(guān)鍵字weak
在屬性前面如果加上了weak
這個屬性所指向的堆內(nèi)存就是一個弱引用
弱引用的關(guān)鍵字unowned
在屬性前面如果加上了unowned
這個屬性所指向的堆內(nèi)存就是一個無主引?,無主引用是非可選類型,不可以賦值為nil,而如果無主引用所指向的堆內(nèi)存已經(jīng)被釋放了,還去訪問和調(diào)用,則程序會崩潰.
也可以用關(guān)鍵字unowned
在構(gòu)建定義占有列表 [unowned self] in
自動構(gòu)造器的繼承
有2種方法自動繼承全部的父類構(gòu)造器:1,子類中沒有一個構(gòu)造器將自動繼承父類所有的構(gòu)造器. 2,子類重載了父類的所有構(gòu)造器(都重載了,當(dāng)然繼承了,并且可以在添加新的)
析構(gòu)函數(shù)
一個對象從內(nèi)存中釋放之前所執(zhí)行的函數(shù),注意的是沒有()
deinit {
print("被釋放了")
}
類型嵌套
swift 支持 內(nèi)部類,內(nèi)部枚舉,結(jié)構(gòu)體等...
class Dog: NSObject {
// 內(nèi)部類 名字
class Name: NSObject {
//內(nèi)部類屬性
var surname:NSString!
var name:NSString!
}
var name : Name = Name();
}