當前位置:首頁 > 芯聞號 > 充電吧
[導讀]swift 最基本的學習結束了,但是很多細節(jié)問題都沒有搞的太明白,看以后的使用情況吧,在應用中再深入理解。明天就可以用swift開發(fā)項目了,高興!//:?Playground?-?noun:?a?pl

swift 最基本的學習結束了,但是很多細節(jié)問題都沒有搞的太明白,看以后的使用情況吧,在應用中再深入理解。明天就可以用swift開發(fā)項目了,高興!


//:?Playground?-?noun:?a?place?where?people?can?play

import?UIKit



/*---------------------1.Swift的基本數據類型-----------------------------*/

var?study?=?0

if?study?<?100
{

????//1.1?Swift?關鍵字和標示符

????//這樣會報錯
????//var?class?=?2;
????var?`class`?=?2?//可以這樣定義于標示符沖突的變量,但是不建議

????/*
????關鍵字分四類:聲明相關的(private)語句相關的(break)類型表達式相關的(self)。特定上下文相關的(left,lazy)。
????*/

????//變量的聲明必須確定類型,可以自己顯示的指定,也可以初始化讓系統(tǒng)推斷類型,下面都可以。

????var?b:Int
????var?a?=?10
????var?c?:Int?=?100

????//也可以一次聲明多個變量,類型也不需要相同

????var?d=20,e:Int,f="hello?"

????//常量聲明用的是let,其他部分聲明方面和變量一樣

????let?constA?=?10
????//constA?=2?不能重新賦值


????//數據輸出
????print(constA)

????print("a的值是:(a),f的值是:(f)")//用(變量的)形式插入到字符串輸出

????//整形

????///?默認的Int長度等于所在平臺的原生字長,細分了Int8,16,32和Uint8,Uint16,32等等

????//var?uchar?:UInt8?=?256?//范圍是0-255?超出范圍?報錯了

????var?unchar?:UInt8?=?0128?//前面加0也可以
????var?binaryInt?=?0b1001_0100?//可以用二進制表示,支持下劃線分開
????var?hexInt?=?0xAf
????var?octalInt?=?0o777?//這是八進制

????//浮點數類型?1.十進制,2.科學技術法??5.2e3?=?5200?3.16進制數表示?0x5.a2p4,?以0x開頭,p代表4

????//的p次方?=?0x5.a2?*?2^4
????//浮點數提供了正無窮大,負無窮大和非數?三個?特殊的浮點數。

????//正的浮點數?除以0.0得到正無窮,負的浮點數除以0.0得到負無窮,0.0除以0.0的非數

????var?float_a?=?5.0,float_b?=?-5.0

????print("正無窮和正無窮相等(float_a/0.0==(4.0/0.0)),負無窮和負無窮相等(float_b/0.0==(-4.0/0.0)),非數和非數自己都不相等(0.0/0.0==(0.0/0.0))")

????//非浮點數除以0.0會報錯的
????//var?int_num=?5
????//int_num/0.0
????//
????//
????//
????//數據類型的轉換,數據類型轉換如果數值超出范圍就會報錯,swift屬于強類型語言,不同類型的值經常需要轉換

????var?t_a:UInt8=100
????var?t_b:UInt16=10

????//類型不一樣,直接編譯出錯
????//t_a=t_b;
????//t_b?=?t_a

????t_b?=?UInt16(t_a)//強制轉換時可以的

????//Bool值只能用true和false,不能用0或非0?表示,其他類型的值也不轉化為bool值。在該使用bool值的地方一定要用Bool

????//這是不行的
????//var?i?=?1
????//if?i
????//{
????//????//
????//}

????//var?i?=?true
????//if?i
????//{
????//????//這是可以的
????//}
????//


????//元組?:tuple?使用圓花括號把多個值復合成一個復合值,定義元組類型的變量

????var?people?=?("zhangsan",14,170.00)?//這是系統(tǒng)推斷的方式

????var?book?:(String,Float,Int)//可以事先聲明
????book?=?("bookname",30.0,2)
????print(book)

????var?test?:?(Int,(Float,String))//元組成員又是元組

????test?=?(10,(100.0,"bookName"))

????//元組訪問

????print(test.0)//可以通過點加下標的方式訪問
????print(test.1.0)
????//元組的拆分

????var?(num,(price,name))=test
????print("(num),(price),(name)")

????let?(c_num,(_,c_name))=test?//可以用下劃線表示要忽略元素
????//可以使用key:value的形式為每個元組內的變量指明名字

????var?health?=?(height:175,weight:65)//可以直接寫值

????var?score?:?(swift:Int,name:String)//也可以后面直接跟這個變量類型聲明

????score?=?(80,"real")?//不寫指定值只能按照格式順序
????score=(name:"real",swift:100)//指定值可以打亂順序.所以訪問元組的數據也可以通過元組的變量名訪問
????print(score.name)



????//可選類型?-

????var?str_val?=?"123"


????var?val1:Int??=?Int(str_val)?//.toInt這個方法找不到了,變成用構造器轉換了不加?代碼編譯不過去,因為轉換可能會失敗。
????//如果沒有選擇?,表示職能轉換為Int,在轉化失敗的時候?屬于『值缺失』,需要處理值缺失的時候即使nil

????//Switf里面?nil和OC的不同,OC里面的nil表示一個不存在對象的指針,Swift里面的nil表示的是確定的值,表示值缺失

????//只有可選類型的變量或常量才能接受nil,非可選的變量和常量不可以接受,一個可選類型沒有初始化,則值就是nil

????var?option_a:String??=?"1234"

????//?強制解析?:可選類型的變量和普通類型的變量不是相同的類型。比如不能直接把Int?直接轉換為Int,用!表示?已知該變量有值,請?zhí)崞鹌渲械闹?
????var?value:Int?=?Int(option_a!)!//------需要這樣寫才能把可選類型的字符串轉化為整數?。?!

????var?n1?:Int??=?100
????var?n2?:Int??=?50
????let?n3?=?n1!+n2!
????print(n3)

????//強制解析必須是可選類型,并且里面確實有值才能成功,否則程序會出錯,可以使用?if?val!=nil?表示如果這個可選類型的變量不等于nil


????//可選綁定?:用于判斷可選類型的變量和常量是否有值,如果可選的有值就賦值給另一個臨時的變量或者常量
????//可以在if分支對可選類型的變量進行判斷

????var?str?:String!="1234"
????if?var?tem?=?str//如果str的值為nil就不會去來這里了
????{
????????print(tem)
????}
????else
????{
????????print("不能解析")
????}

????//隱式可選類型

????//除了在任意已有類型的后面加?表示可選類型外,還可以在后面加!表示可選類型
????//Int!和Int?區(qū)別是,當程序需要獲取Int?類型的變量或常量值時候必須在變量后面添加!執(zhí)行強制解析,
????//Int!不用

????var?aa?:Int??=?100
????var?ab?:Int!?=?50
????var?cc?:Int?=?aa!
????var?dd?:Int=ab

????//類型別名

????//typealias?相當?typedef

????//typealias?myInt??=?Int
????//?字符和字符串

????//Character?表示單個字符?String?表示字符串,字符可以用單個字符,轉義字符,"u{n}"unicode編碼表示?n表示
????//1-8位16進制數

????var?chara:Character?=?"u{2666}"
????print(chara)
????chara?=?"好"

????str?=?"兩個不是圖片的星星??"
????//目前最新的swift?countElement已經被改成了count
????print(str.characters.count)

????//插入字符串可以用字符串插值的方式

????str?=?"前面插入了這些?(str)"

????//for?char?in?str??//無法編譯、
????//{
????//????print(char)
????//}
????//

????var?str_1?=?"first?


?//var?str_2?=?"firsy"
????//print(str_1==str_2)
????//var?hasPrefix:Bool?=?str_1.hasPrefix("first")//是否以特定的開頭
????//var?hasSuffix:Bool?=?str_2.hasSuffix("sy")
????//
????////訪問字符串中的UNICODE碼

????print("這里是UTF8編碼:能用UTF8表示的就顯示一個數,不能用顯示的就會輸出多個,每個表示一個字節(jié),分多個字節(jié)輸出,星星用了226?156?168表示對")
????for?codeUnit8?in?str_1.utf8//這里返回的是一個utf8View類型的值,是一個包含多個Utf8的值的集合
????{
????????print(codeUnit8,terminator:"?")//現在改成這個了?不換行輸出用這個語句

????}
????print("這里是UTF16編碼:和UTF8類似,這里每個表示一個字節(jié)")
????for?codeUnit16?in?str_1.utf16//這里返回的是一個utf8View類型的值,是一個包含多個Utf8的值的集合
????{
????????print(codeUnit16,terminator:"?")//現在改成這個了?不換行輸出用這個語句

????}



????////這里一個表示4個字節(jié)?unicodeScalars返回的?UnicodeScalarView類型的值?包含一個或多個unicodeScalar的值
????////是一個21位的Unitcode碼,需要用.value屬性獲得數值是一個?Uint?32
????//for?codeUnit32?in?str_1.unicodeScalars//這里返回的是一個utf8View類型的值,是一個包含多個Utf8的值的集合
????//{
????//????print(codeUnit32.value,terminator:"?")//現在改成這個了?不換行輸出用這個語句
????//
????//}
}

study++;

//-------------------------?運算符

if?study?<?100
{
????//%求余數運算符?,?可以對小數求余數,兩個操作數都是整數不能對0求余,有一個是浮點數,第二個可以是0.0或0結果是非數,余數的正負只和和除數的正負相關。

????//var?mod?=?7.5%1.2
????//
????//print(mod)?//?=0.3

????//溢出運算符,如果希望程序只是對溢出的數據位進行截斷,而不是導致錯誤,可以使用Swift提供的溢出預算符

????//&(+?-?*?/?%)

????//var?a?:UInt8?=?255
????//
????//var?b:UInt8?=?255+a?//這樣竟然可以
????//
????//a?=?a?&*?6?//溢出后進行截斷操作

????//范圍運算符?a...b?[a?b]?a..<b?[a?b)

????for??var?idx?in?0...100?//(0..<100)
????{
????????print(idx)
????}
????//?引用比較對象運算符?===?和?!====?用來判斷兩個引用類型的變量是否指向同一個對象。,
????//?==?用來比較內容

????var?d1?=?NSMutableArray();
????var?d2?=?NSMutableArray();
????//d1?==?d2?但是?d1!===d2

????//nil?合并運算符??"a??b"?用來在可選類型的變量a是否為nil,如果為nil就返回后者b的值,a和b的類型必須一致

????//相當于?a!=nil?a!:b



}

study++?;
if?study?<?100
{

????//var?a=10
????//if?a>0
????//{
????//????print(a)//即使這里只有一句?也必須用括號括起來
????//}
????//switch不用加break,每一個switch必須包含一條語句
????//不能這樣
????/**
????*?case?1:
????case?2:
????print();

????但是可以這樣
????case?1,2:
????print();
????但是有的時候為了使用C語言里面的貫穿特性

????可以使用fallthrough
????*/

????var?num?=?5;
????switch?num
????{
????case?5...10:?//可以表示范圍
????????print(num)
????????//fallthrough?加上這句話下面的就會執(zhí)行
????default:
????????print(num+1)
????}
????var?point:(x:Int,y:Int);
????point?=?(50,50)

????//(0,0)可以匹配到下面三個,遇到第一個就跳出,所以應該范圍小的條件放在前面
????switch?point
????{
//????case?(x:0,y:0):??//(0,0)?也可以這樣,
//????????print("位于原點")
//????case?(_,0)://元組里面可以匹配范圍
//????????print("x軸>")
//????case?(0,_):
//????????print("位于Y軸")
????case?(0...100,0..0&&y>0:?//在case里面可以進行再次篩選
????????print("第一象限--》")

????default:
????????break;
????}
????//case的值

????print(point)

????//循環(huán)結構

????//var?cnt?=?10
????//while?cnt?<?20
????//{
????//????print(cnt)
????//????cnt++
????//}
????//do
????//{
????//????cnt++
????//}while?cnt<30

????for?idx?in?0?..<?3?//for循環(huán)
????{
????????print(idx)
????}
????for?var?a=0,b=0;a<0&&b<100;a++,b+=10//多個條件初始化
????{
????????print(a,b)
????}
????//for?;;?死循環(huán)
????//{
????//
????//}

????//for?in?用于遍歷字符串,范圍,序列和集合等包含的元素?這里的常量無需聲明
????/**
????*??for?常量名|_?in?字符串|范圍|集合
????*/

????var?friend?=?"myfriend"
????for?/*char*/_?in?friend.characters?//friend.characters?是最新的,原來只要寫friend就行
????{
????????//?print(char)
????????print("kkk")//可以用?"_"來表示常量名,在不需要真正的遍歷內容的時候可以用"_"
????}


????//這里的outer是一個標簽,可以跳出到最外層的循環(huán),有點類似于C語言的go語句,但是swift里面的標簽只有放在循環(huán)
????//開頭出才有用,就像下面這樣
????outer:for?i?in?0??..<?10
????{
????????inner:?for?j?in?0?..<?10
????????{
????????????print(i*j)
????????????if?i*j==4
????????????{
????????????????break?outer
????????????}
????????????if?j==7
????????????{
????????????????continue//不會跳出循環(huán)
????????????????//continue?outer?這里也可以跟一個標簽。忽略標簽所指定的循環(huán)中剩下的語句,默認是inner
????????????}
????????}
????????//continue?outer發(fā)生后后這里的代碼不會執(zhí)行
????}

}

//?-----------------------------------?4.集合


//var?myArrs?:Array;//這里是聲明,還不能用'
//
//
//var?myArr2:[Int]


//這是構造器初始化
var?myArr?=?Array();//需要這樣才能用
myArr.append("one")
myArr+["two"]?//可以這樣?寫加入元素
var?myArr2?=?Array(count:?10,?repeatedValue:?"ones")//可以這樣


//這里是簡化語法初始化

var?b?=?("books",15);

var?values?=?["a","b","c"]
//訪問數組的元素可以使用下標
print(values[0])
values.count//數組的個數

for?element?in?values
{
????print(element)
}
values?.insert("d",?atIndex:?0)
//數組的可變性和可修改性完全取決于是用let還是var
//數組的下標可以是范圍
values[0...1]

//多維數組

var?secArr?:[[Int]]?//一個Int類型的二維數組

secArr?=?Array<Array>(count:?4,?repeatedValue:?[])//表示最外層的數組裝了四個一維數組

secArr[0]?=?Array(count:?5,?repeatedValue:?1)



//----這樣的循環(huán)過時了,不知道怎么寫
for?var?i?=?0,len?=?secArr.count;i<len;i?+=?1
{
????for?var?j?=?0,len2?=?secArr[i].count;j<len2;j?+=?1
????{
????????print(secArr[i][j])//遍歷每個數組內的數組元素

????}
}

//

var?n?=?4

var?drawArr?=?Array<Array>(count:?n,?repeatedValue:?[]);//聲明一個二維數組
for?i?in?0??..<?n?
{
????drawArr[0]?=?Array(count:?n,?repeatedValue:?0)
}

drawArr[0].append(10)
drawArr.removeLast();

var?i?=?0,j?=?0,?cur_pos?=?1

var?start?=?0;


drawArr[0]

//-------字典?鍵和值用冒號隔開

var?mydic:Dictionary=["key1":"value1","key2":"value2"]

//聲明語法
var?scores:Dictionary//這里是逗號,

var?scores2:[String:String]?//這里是冒號:

//泛型創(chuàng)建字典

var?scores3:Dictionaryscores3?=?Dictionary(minimumCapacity:?5)

//updateValue會返回一個字典內value的可選類型的值(?),如果原來的鍵值對不存在
//就返回nil
scores3.updateValue(100,?forKey:?"math")

scores3["chinese"]=90
scores3["english"]=80

for?(item,score?)in?scores3//?前面是鍵后面對應的是值
{
????print(item,score)
????
}
var?keys?=?Array(scores3.keys)//必須用Array構造器
scores3.count

//字典的刪除
scores3.removeAll();
//集合的復制,包含的數據是值類型復制副本,引用類型復制指針

var?arr_ori?=?["one","two","three"]
var?arr_cp1?=?arr_ori;
var?arr_cp2?=?arr_ori

arr_cp1[0]+="1"
arr_cp2[0]+="2"

print(arr_cp1[0])
print(arr_cp2[0])

//引用復制

class?User:?NSObject?{
????
????var?name:String
????init(name:String)?{
????????self.name?=?name
????}
}


var?UserOri?=??[User(name:?"wokong"),User(name:?"bajie")]

var?user1=UserOri;
var?use2=UserOri
user1[0].name="oo"
use2[0].name="d"


----?5---------------------?閉包和函數

study+=1;


swift?不僅僅是面向對象的語言

/*
?
?func?函數名(形式參數列表)[->返回值類型]
?{
?
?}
?*/
func?max(x:Int,y:Int)?->?Int?{
????
????return?x>y???x:y
}
//支持多個返回值,需要元組的輔助

func?getmessage(person:String)?->?(String,String)?{
????
????return?("test","100")
}

getmessage("mine")
//也可以指定元組的返回參數
func?getmessage2(person:String)?->?(name:String,height:String)?{
????
????return?("test","100")
}
var?msg?=?getmessage2("test")
print(msg.height,msg.name)?//可以通過屬性訪問


//遞歸函數

func?fn(i:Int)?->?Int?{
????
????if?i==1?{
????????return?i
????}
????else
????{
????????return?i*fn(i-1);
????}
}

//fn()?這樣只有數據類型不直觀
print(fn(5))
//函數的形式參數?name和?msg都是參數

func?sayHi(user?name:String,msg:String)?{
????
????print("程序正在執(zhí)行sayHi()函數")
????print("(name),(msg)")
}
//sayHi(user:?,?msg:?);//?指定參數名

//用局部形參名做形式參數名?-----?這里是swift修改了
//
//func?sayHI2(#name:String)?->?Void?{
//????
//????
//}

//形參默認值,有默認值的話調用的時候可以省略形參,一般把帶有默認值的放在后面。

func?say2(user?name:String="孫悟空")?->?String?{
????
????return?name
}
print(say2());

//個數可變的形參,允許指定數量不確定的形參。在最有一個形參的類型后增加?...?表示可以接受多個參數值,多個參數值被當成數組傳入


func?test(a?:Int,books:String...)?->?Void?{
????
????for?tmp?in?books?{
????????
????????print(tmp)
????}
????
}

test(10,?books:?"OC","swift")

//常量形參和變量形參,形參函數默認的是常量,在函數內不能對參數列表的形參進行修改,如果需要直接使用形式參數做變量,而不需要在函數內重新定義,需要用var
//聲明函數形參
//這里用var修飾已經提示過期了,就是參數就是不可修改的
func?test2(/*var*/?width:Double,height:Double)?->?Void?{
????
//????width?=?100;
????
????//?現在蘋果不能用var修飾了
????
}

//?in?out形參,用inout關鍵字聲明的形參可以進行傳遞真實的值,不是副本,類似于

//C語言的傳地址,這里是可以修改的

func?test3(inout?a:Int,inout?b:Int)?->?Void?{
????
????a?=?a-b
}
//print(test3(&,?b:?&))?打出來就是這個樣子的

var?s_a?=?3,s_b=4;
test3(&s_a,?b:?&s_b)
print(s_a)


//?函數類型?---?C語言里面的函數指針

var?p?=?test3;?//可以直把函數賦值

var?pType:(Int,Int)->Int

pType?=?max;

//函數類型做為參數
func?fuc(a:Int,b:Int,p:(Int,Int)->Void)?->?Void?{
????
????p(a,b);
}
//函數重載,可以定義多個同名函數,但是要形式參數或者返回值不相同。

//函數的嵌套。默認的函數是全局的,嵌套在函數內的函數,在內部有效,可以通過

//前面的函數類型的返回值,返回具體的內容函數供外部調用

//----------------嵌套函數和閉包?,閉包類似于Objective?-C?里面的代碼塊

//--?全局函數是一個有名稱,但是不會捕獲任何值的閉包。嵌套函數是一個有名字
//可以捕獲封閉函數體的值的閉包,閉包表達式是一個簡潔的,可以捕獲封閉函數體的值的匿名閉包

//定義閉包

func?getMathFunc(type:String)?->(Int)->Int??{
????
????
????switch?type?{
????case?"square":
????????return{?(val:Int)?->Int?in?//閉包?,放在一個大括號內,沒有func關鍵字和函數名字
?????????????return?val*val
????????}
????case?"cube":
????????return{?(val:Int)?->?Int?in
????????????return?val*val*val;
????????}
????default:
????????return?{
????????????(val:Int)?->?Int?in
????????????
????????????var?t?=?0;
????????????for??i?in?0...100
????????????{
????????????????t+=i;
????????????}
????????????return?val*t;
????????}
????}
????
}
var?mathFunc?=?getMathFunc("cube");

print(mathFunc(5));

//省略形參名。閉包表達式可省略,返回值的情況下,關鍵字?in也可以省略,閉包表達式可以通過$0,$1,$2來引用第一個,第二個。。。形參

//尾隨閉包

//函數的參數類型是函數類型和閉包類型是相同的,可以傳遞閉包也可以傳遞函數

func?someFunction?(val:Int,fn:(Int)->(Int))->(Int)
{
????//執(zhí)行代碼
???return?fn(val)
}

var?sqare?=?{?(val:Int)->Int?in
????return?val*val;//閉包只有一行代碼,return?關鍵字
}
print(someFunction(10,?fn:?sqare))

//這是普通閉包

someFunction(20,?fn:?{//放的是執(zhí)行體
????(val:Int)->Int?in
????return?val*val;//閉包只有一行代碼,return?關鍵字

})
//這里是尾隨閉包
someFunction(20)//閉包表達式在花括號的外面
{
????(val:Int)->Int?in
????return?val*val;//閉包只有一行代碼,return?關鍵字
}

//閉包捕獲上下文的變量和常量,可以修改上下文中的常量和變量,即使定義這些變量和常量的作用域不存在了,也可以訪問和修改????

func?makeArray(ele:String)->()->[String]?//返回的是一個沒有參數,返回值為String的函數
{
????var?arr:[String]?=?[]

????
????func?addElement()->[String]
????{
????????arr.append(ele)
????????return?arr
????}
????return?addElement
}

//這注意
let?add1?=?makeArray("one")
print(add1())
print(add1())
let?add2?=?makeArray("two")
print(add2())//add2h額add1沒有關系

//閉包是引用類型

var?add3?=?add2?//add3?直接更改值
print(add3())


//------?面向對象上,除了定義自定義類還有枚舉,結構,類。都支持定義存儲屬性,計算屬性,方法,下標,高早起和嵌套類型

//------上面這句話暫時理解不了,信息量有點大呀。。。??說支持所有的類型。類,結構體,枚舉這三種程序單元的內容分別可以定義屬性(存儲屬性和計算屬性),方法,下標,構造器和嵌套類型(嵌套類,嵌套結構體,嵌套枚舉)
//5種類型的成員,這5種成員在類,結構體,枚舉各有區(qū)別



//--?定義枚舉

enum?Season
{
????case?Spring?//?case?關鍵字
????case?Summer
????case?Fall
????case?Winter
????
????//case?one,two?這樣也是可以的
}//?這里沒有給分配一個默認的整數值。枚舉名就代表了一個實例。和整數沒有任何關系

//定義了swift任意類型后,以下幾方面使用

/*

1.聲明變量
2.創(chuàng)建實例
3.訪問類型屬性
4.調用類型方法
5.派生子類

*/
//聲明變量
var?sn?:Season;
sn?=?Season.Spring//可以直接用枚舉的實例賦值

switch?(sn)
{
????case?.Spring:
????????print("spring")
????case?.Summer:
????????print("summer")
????default?:
????print("default")
}

enum?enum2:Int
{
????case?one,two=3,three?//one?=?0.three?=?4
}
enum?enum3:Character?{
????case?one?=?"O"
}
//要么不指定,要么全部都必須確定有值,指定屬性可以使用構造器的屬性
var?day?=?enum2.init(rawValue:?3);//根據值獲取枚舉值,可能失敗的構造器

var?day2?=?day?.rawValue
//枚舉的關聯值
//case?枚舉值?(元組語法)

enum?Planet
{

????case?Earth(Double,String)
????case?Mars(density:Double,name:String)
????case?Sun
}

var?p1?=?Planet.Earth(1.0,?"地球")
var?p2?=?Planet.Mars(density:?2.0,?name:?"火星")

switch(p2)
{
????case??Planet.Earth(var?weight,var?name):?//真是奇葩,可以這樣關聯
????????print(weight,name)
????default:
????????break;
}
//類和結構體?
/*
?區(qū)別:
?1結構體不支持繼承
?2.不支持自定義構造器
?3.結構體是指類型,不是引用類型
?*/

//swift的屬性分為?存儲屬性(實例變量)和計算屬性(相當于property合成的屬性)
//class表示一個屬性或者方法是否屬于類,static?用于結構體和枚舉相當于類里面的class

class?person:??NSObject?{
????
????var?name:String=""http://必須初始化。
????var?age:Int=0?;
????func?say()?->?Void?{
????????
????????print("(name)?--?(age)")
????}
????func?say(message:String)?->?Void?{//函數????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????持重載
????????
????????print("(message)")
????}
????func??growp(a:Int)?->?person?{
????????
????????age+=a
????????return?self
????}
//????init(n:String,a:Int)?{//顯示?定義帶參數的構造器,沒有自定義系統(tǒng)會提供一個默認的
//????????
//????????self.age=a;
//????????self.name=n
//????}
}

var?per1?=?person();
per1.name?=?"P1"
per1.age?=?0;
per1.say()
per1.say("消息")

var?per2?=?person()
per2.name="P1"
per2.age=0;


//===判斷應用類型,==比較值類型,可以重載==號,自己定義比較類型

func?==(p1:person,p2:person)?->?Bool??{
????
????if?p1.name==p2.name&&p1.age==p2.age?{
????????
????????return?true
????}
????return?false
}

print(per2==per1)

per1.growp(1).growp(2)?//這里類似于OC里面的鏈式編程


//存儲屬性--?存儲在類,結構體,枚舉內部的常量或者變量。
struct?FixedLengthRange?{
????
????var?start:Int
????//定義常量存儲屬性
????let?length?:Int
????//系統(tǒng)會為?"結構體"???提供所有存儲屬性的構造器,所以可以不指定初始值
}

var?rg?=?FixedLengthRange(start:?2,?length:?3);
//rg.length=0?初始化后就不能改

class?lazyC:?NSObject?{
????
????lazy?var?tem?=?100//懶加載關鍵在,類似于OC里面的重寫get方法里面初始化,通過.語法訪問才初始化
}
//計算屬性?property屬性,實例計算屬性和類計算屬性

enum?XBSeanon?:Int{
????case?Spring,Summer,Fall,Winter
????//info就是計算屬性
????var?info:String{
????????//在這里寫get和set方法
????????get{
????????????switch?self?{???//去掉get方法就是只讀屬性
????????????case?.Spring:
????????????????return?"春"
????????????default:
????????????????return?"非春天"
????????????}
????????}
????????set(newValue)//這個形參可以省略,
????????{
????????????if?newValue=="春天"?{
????????????????self?=?.Spring
????????????}
????????????else
????????????{
????????????????self?=?.Summer//瞎寫測試
????????????}
????????}
????
????}
????mutating?func?changeV()?//mutatiing?表示可變,用在結構體和枚舉
????{
????????self?=?XBSeanon(rawValue:?(self.rawValue+1)%3)!
????}
}

//var?mys?=?XBSeanon.Spring
//print("(mys.info)")//get
//mys.info?=?"春天"
////屬性觀察者。類似于KVO或者重寫set方法實現的功能

class?User?{
????//這里的屬性觀察沒有什么意義,因為沒有重寫setter方法和getter方法,對屬性賦值操作檢查應該在set方法做檢查,
????var?name?:String?=?""?{//不能監(jiān)聽懶加載的熟悉
????????
????????willSet{
????????????//這里放的是屬性賦值前,自動要執(zhí)行的代碼
????????????if?newValue.characters.countInt??//輸入參數不支持指定外部參數,返回值可以返回任意類型,數組就是下標,字典就是value的類型
????{
????????get{
????????????//定義一段可執(zhí)行的代碼,
????????????switch(idx)
????????????{
????????????????case?0:
????????????????????return?self.x
????????????????case?1:
????????????????????return?self.y
????????????????case?2:
????????????????????return?self.width;
????????????????case?_?:
????????????????????return?self.heigth
????????????????
????????????}
????????}
????????set
????????{
????????????switch?(idx)
????????????{
????????????????case?0:
????????????????????self.width?=?newValue
????????????????default:
????????????????????self.heigth?=?newValue
????????????}
????????}
????}
????//int?是訪問的形式,可以是字符串,聯想字典?dict[@"one"];
????subscript?(idx:Int)?->?String??//輸入參數不支持指定外部參數,返回值可以返回任意類型,數組就是下標,字典就是value的類型
????????{
????????get{
????????????//定義一段可執(zhí)行的代碼,
????????????switch(idx)
????????????{
????????????case?0:
????????????????return?"width"
????????????case?1:
????????????????return?"height"
????????????case?2:
????????????????return?"x"
????????????case?_?:
????????????????return?"y"
????????????}
????????}
????????set
????????{
????????????switch?(idx)
????????????{
????????????case?0:
????????????????self.width?=?12
????????????default:
????????????????self.heigth?=?123
????????????}
????????}
????}

????
}

var?rect?=?FKRect(x:?0,?y:?0,?width:?100,?heigth:?100)
rect[0]=100?//通過下標引用

var?num:String?=?rect[0]
print(rect.width)
//--------------------------可選擇鏈
//可選鏈代替強制解析

class?BOOK?{
????
????var?bookName:String!
????init(name:String)
????{
????????self.bookName?=?name
????}
}
class?Student?{
????
????var?book:BOOK!
????
}
class?School?{
????
????var?stu:Student!
}
var?school?=?School()
//print(school.stu.book)//?這樣寫就錯了??梢园?!換成?作為可選鏈。!表示隱式解析,?表示可選鏈。中間有一個為nil就會返回nil,不會繼續(xù)向后執(zhí)行。
print(school.stu?.book)
//可選鏈?適用于?屬性,方法,下標

//-----類屬性和類方法?(枚舉,類,結構體自身的方法)

//--值的類型屬性包含枚舉和結構體,用static修飾,包含存儲屬性和計算屬性?!啊薄啊鳖惖念愋蛯傩灾荒芏x計算屬性“”“”“”“
//構造器---無須顯示的聲明返回值類型,無須顯示的使用return返回實例,名字都是init函數,可以有多個函數重載
/**
?*??對于結構體提供兩個構造器,無參數的和初始化所有的。對于類提供了無參數的。需要自定義的時候就自定義,自定義后就不在提供默認的
?
?
?構造器的外部參數和局部參數相同--swift做的。
?*/

class?TestInit?{
????
????var?name:String?
????let?const?=?10
//????
//????init(_?n:String)
//????{
//????????self.name?=?n
//????????//self.const?=?100//這里是不能被修改的。據課本上說原來是可以的
//????}
????//構造器也可以重載
????//可能失敗的構造器,
????init?(_?n:String)//可能失敗的構造器
????{
????????if?n.characters.countInt
????{
????????return?Str.characters.count;
????}
}

//?--?協(xié)議

@objc?protocol?Draw?//可選類型要有objc符號
{
????@objc?optional
????var?drawCirle:Double{get?set};//屬性
????func?drawCubic(width:Double);//方法
}

class?SwitftDraw:Draw
{
????
????@objc?var?drawCirle:Double
????????{
????????get{
????????????return?self.drawCirle;
????????}
????????set
????????{
????????????self.drawCirle?=?newValue;
????????}
????}
????@objc?func?drawCubic(width:?Double)?{
????????
????????print("立方體?(width)")
????}
}
//泛型?類型占位符

func?copyArray(src:[T],inout?dest:[T])
{
????
????for?element?in?src
????{
????????dest.append(element)
????}
????
}
//這個方法可以復制任意類型的數組
//可以定義多個不同的參數
func?projection(src?:[SrcType],fn:(SrcType)->DesType)?->[DesType]

{
????var?result?=?[DesType]();
????for?element?in?src
????{
????????result.append(fn(element));
????}
????return?result;
}

var?books?=?["C和指針","算法導論"]

var?proj?=?projection(books){
????
????$0.characters.count
}
//類也可以使用泛型
class?AppleS//這里通過協(xié)議對泛型進行限定
{
????var?info:T
????init(info:T)
????{
????????self.info?=?info
????}
}
extension?AppleS
{
????//擴展類可以直接使用泛型
????func?bigThan(other:AppleS,fn:(T,T)?->Int)?->Bool?{
????????
????????if?fn(self.info,other.info)>0
????????{
????????????return?true;
????????}
????????else
????????{
????????????return?false;
????????}
????}
}
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯系該專欄作者,如若文章內容侵犯您的權益,請及時聯系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數據產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數據產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯合牽頭組建的NVI技術創(chuàng)新聯盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現場 NVI技術創(chuàng)新聯...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉