Swift基礎

swift:(顏色標記:藍色——紫色褐色 紅色標記重點,黑色正常輸入)ios


筆記正文:
2010年7月開始設計,2014年wwdc(蘋果開發者大會)上發佈,譯爲:「雨燕」,能夠跟object-c同樣,用於開發iOS,Mac應用程序。
特色:
從中能夠看到Objective-C,JavaScript,C#,Python等語言的影子;
借鑑了上面這些語言的優勢;
同時具有編譯型語言高性能腳本語言靈活交互性;
能夠輕鬆地與Objective-C、C混合使用(相互調用)。
開發的目的:取代Objective-C;讓應用開發更簡單、更高效、更穩定。
 
相關數據:
使用Swift語言開發的條件是什麼:
Xcode版本>=6.0;
Mac版本>=10.9.3
Swift自從發佈以後,備受開發者關注,發佈當天(1天的時間內)
Xcode 6 beta下載量突破1400萬次;
官方發佈的電子書《The Swift Prongramming Language》下載量突破37萬次;
一個國外開發者使用Swift實現了Flappy Bird遊戲(這位開發者上手Swift的時間只有4個小時,編程加上休息時間,接近9個小時)。
 
相關人物:Chris Lattner
Swift的首席架構師;LLVM項目的主要發起人與做者之一;Clang編譯器的做者;蘋果[開發工具]部門的主管;領導Xcode、Instruments和編譯器團隊;2010年7月開始住到開發Swift編程語言;Swift的大部分基礎架構均由他1人完成。 ————大神中的大神
 
性能:
官方給出的是性能很是好,可是對此表示懷疑???
忠告:
目前的性能不是卡開發者最須要擔憂的問題;
 蘋果已經全盤掌握了這個語言的方方面面:從底層編譯框架再到語言設計;
優化之路纔剛剛開始,做爲開發者,須要給這門新語言一點點耐心和信心
 
Swift和Objective-C代碼格式對比
添加一個按鈕爲例:
Objective-C
1.UIButton *btn = [[UIButton alloc] init];
2.btn.frame = CGRectMake (20,20,20,20);
3.btn.backgoundColor = [UIColor blueColor];
4.[self.view addSubview:btn];
Swift:
1.var btn = UIButton()
2.btn.frame = CGRectMake (20,20,20,20)
3.btn.backgoundColor = UIColor.blueColor()
4.self.view addSubview(btn)
 
使用,學習Swift:
從學習Swift的語言角度看:
Swift是一門新語言,語法難度對每一個程序員都差很少;
從使用Swift開發iOS程序的角度看:
使用Object-C的老牌iOS程序員更佔優點;
由於從Object-C轉爲Swift去開發iOS程序,僅僅是書寫的格式變換了,iOS開發的步驟、思想、框架都沒有改變。
 
1、Swift變量和常量<語法須知>
Swift的源文件擴展名是.swift
2個不須要:
不須要編寫main函數(默認從上往下按順序執行,因此最前面的代碼會被自動看成程序的入口);
不須要在每一條雨具後面加上分號(喜歡的話加上也是能夠的;有一種狀況必須加分號:同一行代碼上有多條語句時);
註釋:
單行註釋:// 單行註釋
多行註釋:/* 多行註釋 */
注:多行註釋能夠嵌套多行註釋 (C和OC中這樣是會報錯的):
/* 外層註釋
/* 內層註釋   
    多行註釋  */ 
    外層註釋 */
 
常量和變量
如何聲明常量和變量:
用let來聲明常量:let radius = 10
用var來聲明變量:1.var age = 20 2.var x = 0.0,y = 0.0,z = 0.0
 
PlayGroud的使用:
Xcode自帶的一個工具,能夠在屏幕右邊框內直接看到左邊代碼的執行結果,點後邊的加號能夠在下邊更加直觀的顯示,UI也能夠。(練習的時候可使用,仍是挺好的)。
 
字符串:
字符串是String類型的數據,用雙引號「」包住文字內容
let website = "http://ios.itcast.cn」
 
字符串的常見操做:
用加號+作字符串拼接
1.let scheme = 「http://「
2.let path = 「iOS.itcast.cn」
3.let website = scheme + path     //website的內容是: "http://ios.itcast.cn」
用反斜線\和小括號()作字符串插值(把常量\變量插入到字符串中)
1.let hand = 2
2.var age = 20
3.let str = 「我今年\(age)歲了,有\(hand)隻手」  //str的內容是:「我今年20歲了,有2隻手」。
整數轉成字符串:var str = String(age);var str2 = 「\(age)」;這兩種方法均可以。
 
打印輸出:Swift提供了2個打印輸出函數
println:輸出內容後會自動換行;
print:對比println,少了個自動換行的功能;
 
常量和變量的命名:
基本上能夠用任何你喜歡的字符來做爲常量和變量名
1.let 網址 = 「http://ios.itcast.cn」
2.let 🐶🐮 = 「小狗和母牛」
🐶和🐮是emoji表情,是一種特殊的Unicode字符;
能夠在Mac上經過快捷鍵:control + command + 空格,彈出emoji鍵盤;
 
常量和變量名的注意點:
不能包含數學符號(好比 +、-、*、\);
不能包含箭頭(好比←、→、↑、↓)
不能包含非法無效的Unicode字符(好比⚽️)
不能是關鍵字(好比let、var)
不能以數字開頭(好比123go)
不能是單獨一個下劃線_ (好比var _ = 10)
 
數據類型:
Swift中經常使用的數據類型有:
Int Float Double Bool Character String
Array Dictionary 元組類型(Tuple) 可選類型(Optinal)
能夠看出:數據類型的首字母都是大寫的
 
如何指定變量\常量的數據類型
在常量\變量名後面加上 冒號(:)和類型名稱
let age: Int = 10
上面代碼表示:定義了一個Int類型的常量age,初始值是10
通常來講,沒有必要明確指定變量\常量的類型
若是在聲明常量\變量時賦了初始值,Swift能夠自動推斷出這個常量\變量的類型
let age = 20
//Swift會推斷出age是Int類型,由於20是個整數
 
變量的初始化:
Swift嚴格要求變量在使用以前必須進行初始化
下面代碼是錯誤
1.var a: Int
2.let c = a + 10
解析:1>第1行代碼中:Swift並不會爲變量a賦初值,a沒有初始化
 2>第2行代碼會報錯
下面代碼是正確
1.var a: Int = 20 
2.let c = a + 10
 
整數:
整數分爲2種類型:
符號(signed):正、負、零
符號(unsigned):正、零
Swift提供了八、1六、3二、64位的有符號和無符號整數,好比
UInt8:8位無符號整型
Int32:32位有符號整型
Int八、Int1六、Int3二、Int6四、
UInt八、UInt1六、UInt3二、UInt64
 
最值:
能夠經過min和max屬性來獲取某個類型的最小值和最大值
1.let minValue = UInt8.min 最小值等於0
2.let maxValue = UInt8.max 最大者等於255
 
Int和UInt
Swift還提供了特殊的符號整數類型Int符號整數類型UInt
Int\UInt的長度和當前系統平臺同樣
>在32位系統平臺上,Int和UInt的長度是32位
>在64位系統平臺上,Int和UInt的長度是64位
Int在32位系統平臺的取值範圍:-214783648~214783647
建議:
在定義變量時,別老是在考慮有無符號、數據長度的問題
儘可能使用Int,這樣能夠保證代碼的簡介、可複用性。
 
存儲範圍:
每種數據類型都有澤子的存儲範圍,好比:
Int8的存儲範圍是:-128~127
UInt8的存儲範圍是:0~255
若是數值超過了存儲範圍,編譯器會直接報錯
下面的語句都會直接報錯
1.let num1: UInt8 = -1
2.let num2: Int8 = Int8.max + 1
第1行代碼報錯緣由:UInt8不能存儲負數
第2行代碼報錯緣由:Int8能存儲的最大值是Int8.max
 
整數的表示形式:
十進制數:沒有前綴
let i1 = 10 //10
二進制數:以0b爲前綴
let i2 = 0b1010 //10
八進制數:以0o爲前綴
let i3 = 0o12 //10
十六進制數:以0x爲前綴
let i4 = 0xA //10
 
浮點數:
浮點數,就是小數。
Swift提供了兩種浮點數類型
Double:64位浮點數,當浮點值很是大或須要很是精確時使用此類型
Float:32位浮點數,當浮點值不須要使用Double的時候使用此類型
精確程度
Double:至少15位小數
Float:至少6位小數
若是沒有明確說明類型,浮點數默認就是Double類型
let num = 0.14 //num是Double類型的常量
 
浮點數的表示形式
浮點數可使用十進制和十六進制2中進制來表示
十進制(沒有前綴)
沒有指數:let d1 = 12.5
有指數:let d2 = 0.125e2
//0.125e2 == 0.125 * 10²   MeN ==M * 10的N次方
十六進制(以0x爲前綴,且必定要有指數)
let d3 = 0xC.8p0
//0xC.8p0 == 0xC.8 * 2º == 12.5 * 1  0xMpN == 0xM * 2的N次方
let d3 = 0xC.8p1
//0xC.8p1 == 0xC.8  * 2^1== 12.5 * 2 == 25.0 
 
數字格式:
數字能夠增長額外的格式,使它們更容易閱讀
能夠增長額外的零 0
1.let money = 0019999 //1999
2.let money2 = 001999.000 //1999.0
能夠增長額外的下劃線_,以增長可讀性
1.let oneMillion1 = 1_000_000 //1000000
2.let oneMillion2 = 100_0000 //1000000
3.let overOneMillion = 1_000_000.000_001 //1000000.000001
增長了額外的零 0和下劃線_,並不會影響原來的數值大小。
 
類型轉換
兩個類型不相同的數值,是不能直接進行運算的
下面的語句是錯誤的
1.let num1:UInt8 = 10
2.let num2:Int = 20
3.let sum :Int = num1 + num2(×)    改正:let sum :Int = Int(num1) + num2(
第3行會報錯
報錯緣由:num1是UInt8類型,num2是類型Int,類型不一樣,不能相加
解決方案:將num1轉爲Int類型,就能與num2進行相加
 
下面的語句是錯誤的
1.let num1 = 3
2.let num2 = 0.14
3.let sum = num1 + num2(×)    改正:let sum = Double(num1) + num2(
第3行會報錯
報錯緣由:num1是Int類型,num2是類型Double,類型不一樣,不能相加
解決方案:將num1轉爲Double類型,就能與num2進行相加
注意:下面的寫法是正確的
let sum = 3 + 0.14
➹ 3和0.14相加獲得結果3.14,等賦值之後,編譯器纔會自動推斷出sum是Double類型
 
類型別名
可使用typealias關鍵字定義類型的別名,跟C語言的typedef做用相似
typealias MyInt = Int //給Int類型起了個別名叫作MyInt
 
原類型名稱能用在什麼地方,別名就能用在什麼地方
聲明變量\常量類型
 let num:MyInt = 20
得到類型的最值
let minValue = MyInt.min
類型轉換
let num = MyInt(3.14) //3
 
運算符:
Swift所支持的部分運算符有:
賦值運算符:=
複合賦值運算符:+=、—=
算數運算符:+、—、*、/
求餘運算符:%
自增、自減運算符:++、— —
比較運算符:==、!=、>、<、>=、<=
邏輯運算符:&&、||、!
三目運算符:?:
範圍運算符:..<...
溢出運算符:&+&—&*&/&%
 
賦值運算符:
1對1賦值
var a = 5
N對N賦值
let (x,y)={1,2} //x的值是1,y的值是2,而且都是常量
跟C\OC不同的是:Swift的賦值運算符沒有返回值
if(x,y){}     //左邊的代碼是錯誤的,由於x=y並無反悔具體的值
注:這樣的好處是防止誤用=和==
 
求餘運算符:
%在Swift中叫「求餘運算符」,也有語言叫作「模運算符」
9 % 4 //1
-9 % 4 //-1
9 % -4 //1
-9 %- 4 //-1
注:求餘結果的正負跟%左邊數值的正負同樣
跟C語言不同的是,Swift的%支持浮點數的計算
8 % 2.5 //0.5
 
BOOL
Bool類型,也被稱爲邏輯類型(Logical),就2種取值
true:真
false:假
在C語言中:0是假,非0就是真;而在Swift中沒有這種概念
if語句的條件必須是Bool類型的值
錯誤寫法
if (10){
println(「條件成立」)
正確寫法:
if(true){
println(「條件成立」)
 
比較運算符\邏輯運算符\三目運算符
比較運算符\邏輯運算符會返回Bool類型的值,取值有2中可能
true:真,6 > 5,(7 > 6) && (9 != 7)
false:假,6 < 5,(7 >= 6) && (9 == 7)
三目運算符的條件必須是Bool類型的值
錯誤寫法:
let a = 10
let c = a ? 100 : 200
正確寫法:
let c = a != 0 ? 100 : 200
let c = false ? 100 : 200
 
範圍運算符:
範圍運算符用來表示一個範圍,有2中類型的範圍運算符
閉合範圍運算符:a...b,表示[a,b],包含a和b
半閉合範圍運算符:a..<b,表示[a,b),包含a,不包含b
舉例:
for index in 1…5{
println(index)
} //index的值從1~5
 
for index in 1..<5{
println(index)
} //index的值從1~4
 
溢出運算符
每種數據類型都有本身的取值範圍,默認狀況下,一旦賦了一個超出取值範圍的數值,會產生編譯或者運行時錯誤
下面的寫法是錯誤的
1.let x = UInt8.max
2.let y = x + 1
第2行代碼會在運行時報錯
Swift爲整型計算提供了5&開頭的一出運算符,能對超出取值範圍的數值進行靈活處理。
 
值的上溢出
1.let x = Uint8.max
2.let y = x &+ 1
第1行代碼事後:x 的值是255(最大值)
第2行大媽事後:y 的值是0(最小值)
以下圖分析:
值的下溢出:
1.let x = Uint8.min
2.let y = x &- 1
第1行代碼事後:x 的值是0(最小值)
第2行代碼事後:y 的值是255(最大值)
有符號整數也有相似的溢出現象:
1.let x = Int8.min
2.let y = x &- 1
第1行代碼事後:x 的值是-128(最小值)
第2行代碼事後:y 的值是127(最大值)
除零溢出
默認狀況下,一個數除以0,或者對0求餘數,編譯器會直接報錯
1.let x = 10
2.let y = x / 0
3.let z = x % 0
第二、3行代碼:編譯器都會報錯
若是使用溢出運算符,就不會報錯
1.let x = 10
2.let y = x &/ 0
3.let z = x &% 0
y和z的值最終都是0
 
Swift元組類型
什麼是元組類型????
定義:元組類型那個有N個任意類型的數據組成(N >= 0),組成元組類型的數據能夠稱爲「元素
let position = (x:10.5,y : 20)
//position有2個元素,x、y是元素的名稱
let person = (name:「Jack」)
//person只有name一個元素
let data = () //空元組
 
元素的訪問
var position = (x:10.5,y:20)
用元素名稱
let value = position.x //取值
position.y = 50 //設值
用元素位置
var value = position.0 //至關於var value = position.x
position.1 = 50 //至關於position.y = 50
注意:若是用let來定義一個元組,那麼就是常量,就沒法修改它的元素
 
元組的輸出
能夠輸出整個元組來查看全部元素的值
1.var point = (x:10.5,y:20)
2.point.x = 30
3.point.1 = 50
4.println(point)
輸出結果是(30.0,50)
 
使用細節
能夠省略元素名稱
1.let position = (10,20)
2.let person = (20,「jack」)
能夠明確hiding元素的類型
var person:(Int,String)=(23,「rose」)
person的第0個元素只能是Int類型、第1個元素只能是String類型
注意:
在明確指定元素類型的狀況下不能加上元素名稱
所以,下面的語句是錯誤的
var person:(Int,String)=(age:23,name:「rose」)
能夠用多個變量接受元組數據
1.var(x,y)=(10,20) //x是10,y是20
2.var point = (x,y) //point由2個元素組成,分別是10和20
能夠將元素分別賦值給多個變量
1.var point = (10,20)
2.var (x,y)= point
//x是10,y是20
可使用下劃線_忽略某個元素的值,取出其餘元素的值
1.var person = (20,「jack」)
2.var (_,name)= person
//name的內容是「jack」,person中的元素20被忽略
 
Swift流程機構:
Swift支持的流程結構
循環結構:for、for-in、while、do-while
選擇結構:if、switch
注意:這些語句後面必定要跟上大括號{}
跟C語言對比:
用法基本同樣的有:for、while、do-while、if
所以只須要關注for-in、switch便可
 
for - in
for - in和範圍運算符
1.for i in 1. . .3{
2. println(i)
3.}
//按順序從fanwie中取值賦值給i,每取1次值,就執行1次循環體
//範圍的長度就是循環體執行的次數
若是不須要用到範圍中的值,可使用下劃線_進行忽略
1.for _ in 1. . .3{
2. println(「**********")
3.}
 
Switch的通常結構
1.let grade = 「B」
2.switch grade{
3.case 「A」:
4. println(「優秀等級」)
5.case 「B」
6. println(「良好等級」)
7.case 「C」
8. println(「中等等級」)
9.default
10. println(「未知等級」)
11.}
Switch語句在Swift和C中的區別
在C語言中
若是case的結尾沒有break,就會接着執行下一個case
在Swift中
不須要在每個cse後面增長break,執行完case對應的代碼後默認會自動退出switch語句。
 
Switch的注意
在Swift中,每個case後面必須有能夠執行的語句
1.let grade = 「B」
2.switch grade {
3.case 「A」:
4.case 「B」:
5. println(「良好等級」)
6.default:
7. println(「未知等級」)
8. }
//第3行代碼會 報錯
 
case的多條件匹配
1個case後面能夠填寫多個匹配條件,條件之間用都逗號,隔開
1.let score = 95
2.switch score/10 {
3.case 10,9
4. println(「優秀」)
5.case 8,7,6:
6. println(「及格」)
7.default:
8. println(「不及格」)
9.}
//打印結果是:優秀
case 的範圍匹配
case後面能夠填寫一個範圍做爲匹配條件
1.let score = 95
2.switch score/10 {
3.case 90…100:
4. println(「優秀」)
5.case 60…89
6. println(「及格」)
7.default:
8. println(「不及格」)
9.}
//打印結果是:優秀
注意:
switch要保證處理全部可能的狀況,否則編譯器直接報錯。
所以,這裏的default必定要加,否則就出現了一些處理不到的狀況。
 
case匹配元組
case還能夠用來匹配元組
//好比判斷一個點是否在矩形框內???
1.let point = (1,1)
2.switch point {
3.case(0,0)
4. println(「這個點在圓點上」)
5.case(_,0)
6. println(「這個點在x軸上」)
7.case(0,_)
8. println(「這個點在y軸上」)
9.case(-2…2,-2…2)
10. println(「這個點在矩形框內」)
11.default:
12. println(「這個點在其餘位置」)
13.}
第5,7行代碼中_的做用(2中理解方式)
➹能匹配任何值
➹忽略對應位置元組元素
 
case的數值綁定
在case匹配的同時,能夠將switch中的值綁定給一個特定的常量或者變量,以便在case後面的語句中使用
1.let point =(10,0)
2.switch point{
3.case (let x,0)
4. println(「這個點在x軸上,x 的值是\(x)」)
5.case (0,let y)
6. println(「這個點在y軸上,y的值是\(y)」)
7.case let(x,y)
8. println(「這個點的x值是\(x),y的值是\(y)」)
9.}
//打印:這個點在x軸上,x 的值是10
 
where
switch語句可使用where來增長判斷的條件
//好比判斷一個點是否在下圖的綠線或紫線上???
1.var point = (10,-10)
2.switch point{
3.case let(x,y)where x==y:
4. println(「這個點在綠線上」)
5.case let(x,y)where x ==y:
6. println(「這個點在紫線上」)
7.default:
8. println(「這個點不在這2條線上」)
9.}
//打印:這個點在紫線上
 
fallthrough
fallthrough的做用
執行完當前case後,會接着執行fall through後面的case或者default語句
1.let num = 20
2.var str =「\(num)是個」
3.switch num{
4.case 0…50:
5. str += 「0~50之間的」
6. fallthrough
7.default:
8. str +=「整數」
9.}
//打印:20是個0~50之間的整數
注意:fallthrough後面的case條件不能定義變量和常量
 
標籤
使用標籤的其中1個做用:能夠用於明確指定要退出哪一個循環
//作2組俯臥撐,每組3個,作完一組就休息一會
1.group:
2.for _ in 1…2{
3. for item in 1…3{
4. println(「作1個俯臥撐」)
5. if item ==2{
6. break group
7.
8.
9. println(「休息一會」)
10.}
輸出結果是:跳出了內循環
//作一個俯臥撐
//作一個俯臥撐
//若是沒有group,只有break,輸出結果:
作1個俯臥撐,休息一會
作1個俯臥撐,休息一會
 
函數:
函數的定義格式
1.func 函數名(形參列表)->返回值類型{
2. //函數體…
3.}
形參列表的格式
形參名1:形參類型1,形參名2:形參類型2,.......
舉例:計算2個整數的和
C:
1.int sum(int num1,int num2){
2. return num1 + num2
3.}
Swift:
1.func sum(num1:Int,num2:Int)-> Int{
2. return num1 +num2
3.}
 
沒有返回值的函數
若是函數沒有返回值,有3中寫法:
1.func 函數名(形參列表)->Vodi{
2. //函數體...
3.}
 
1.func 函數名(形參列表)->(){
2. //函數體...
3.}
 
1.func 函數名(形參列表){
2. //函數體..
3.}
注:typealias Void =()
 
沒有形參的函數
一個函數若是沒有形參,函數名後面的小括號也不能省略
1.func 函數名()-> Int{
2. //函數體
3.}
上面的函數沒有形參、返回值Int類型
 
返回元組的函數
一個額函數也能夠返回元組數據
1.func find(id:Int)->(name:String,age:Int)
2. if id > 0{
3. return(「jack」,20)
4. }else{
5 return(「nobody」,0)
6. }.
7.}
8.var people = find(2)
9.println(「name=\(people.name),age=\(people.age)」)
 
外部參數名
通常狀況下,經過形式參數的的名字,就能推斷出這個參數的含義和做用
1.func addStudent(name:String,age:Int,no:Int){
2. println(「添加學生:name=\(name), age=\(age), no=\(no)」)
3.}
在函數內部一看參數名就知道這3個參數的做用
可是, 形式參數 是用在函數內部的,當調用函數是就 看不到形參的名字 ,有可能致使之後會不太明白每一個參數的含義
addStudent(「jack」,20,19)
一眼望去,能纔出第1個參數「jack」是指姓名,後面的20,19分別表明 什麼含義
 
爲了解決上述問題,Swift提供了 外部參數名 語法
外部參數名能夠在調用函數時提醒每一個參數的含義
1.func 函數名( 外部參數名 形式參數名:形式參數類型)->返回值類型{
2. //函數體...
3.}
➹外部參數名寫在形式參數名的 前面,與形式參數名之間用 空格隔開
舉例:
1.func sum(number1 num1:Int,number2 num2:Int)->Int
2.{
3. return num1+num2
4.}
5.sum(number1:10,number2:20) //調用函數
注意:一旦定義了外部參數名,在調用函數式就必須加上外部參數名
 
外部參數名的簡寫
使用 # 能建華外部參數名的定義
1.func sum(#num1:Int,#num2:Int)
2.{
3. return num1+num2
4.}
第1行代碼的意思:num一、num2即便形式參數名,又是外部參數名
//調用函數 sum(num1:10,num2:20)
 
默認參數值
能夠在定義函數時,給形參指定一個默認值,調用函數時,就能夠不用給這個形參傳值
1.func addStudent(name:String,age:Int = 20){
2. println(「添加1個學生:name=\(name), age=\(age)」)
3.}
4.addStudent(「jack」)
age參數有個默認值20,因此第4行調用函數時能夠不傳值給age參數
輸出結果:添加1個學生:name= jack,age=20
 
帶有默認參數值的形參,Swift會自動給它生成一個跟形參名相同的外部參數名
age:Int = 20至關於#age:Int = 20
所以,若是要傳入age參數值時,只能這麼調用
addStudent(「jack」,age:25)
在帶有默認參數值的參數名前加個 下劃線_,調用函數時就不用寫外部參數名
1.func addStudent(name:String,_ age:Int = 20){
2. println(「添加1個學生:name=\(name), age=\(age)」)
3.}
4.addStudent(「jack」,25)
 
常量和變量參數
默認狀況下,函數的參數都是常量參數,不能在函數內部修改
1.func test(num:Int){
2. num = 10
3.}
func test(num:Int)參數至關於func test(let num:Int)
第2行代碼會 報錯
在有些狀況下,可能須要在函數內部修改參數的值,這時須要定義變量參數
在參數名前面加個var便可
1.func test(var num:Int){
2. num = 10
3.}
舉例: //編寫函數在某個字符串的尾部拼接N個其餘字符串
1.func append( var string:String,suffix:String,count:Int)-> String
2.{
3. for _ in 0. . < count{
4. string += suffix
5.
6. return string
7.}
8.var destStr = append(「jack」,「+」,4)
//輸出結果:jack++++
 
輸入輸出參數:
什麼是輸入輸出:
C語言 中,利用指針能夠在函數內部修改外部變量的值
Swift 中利用輸入輸出參數,也能夠在函數內部修改外部變量的值
輸入輸出參數 ,顧名思義,能輸入一個值進來,也能夠輸出一個值到外部
 
輸入輸出參數的定義
在參數名前面加個inout關鍵字便可
1.func swap(inout num1:Int,inout num2:Int){
2.}
舉例:寫一個函數交換外部2個變臉的值
1.func swap(inout num1:Int,inout num2:Int){
2. let tempNum1=num1
3. num1 = num2
4. num2 = tempNum1
5.}
6.var a = 20
7.var b = 10
8.swap(&a,&b) //傳入的參數前面必須加上&
9.a
10.b
//執行完swap函數後,a的值是10,b的值是20
 
面試題
//如何在不利用第3方變量的前提下,交換2個變量的值
第1種作法:
1.func swap(inout num1:Int,inout num2:Int){
2. num1 =num1 + num2
3. num2 =num1 - num2
4. num1 =num1 - num2
5.}
6.var a = 20
7.var b = 10
8.swap(&a,&b)
9.a
10.b
第2種作法:
1.func swap(inout num1:Int,inout num2:Int){
2. num1 =num1 ^ num2
3. num2 =num1 ^ num2
4. num1 =num1 ^ num2
5.}
 
輸入輸出參數的使用注意
➹傳遞實參時,必須在實參的前面加上&
➹不能傳入常量或者字面量(好比10)做爲參數值(由於它們都不可改)
➹輸入輸出參數不能有默認值
➹輸入輸出參數不能是可變參數
➹輸入輸出參數不能再使用let、var修飾(intout和let、var不能共存)
 
輸入輸出參數的價值之一:
能夠實現函數的多返回值(其實讓函數返回元組類型,也能實現返回多個值)
代碼1:
1.func sumAndMinus(num1:Int,num2:Int)-> (sum:Int,minus:Int){
2. return(num1+num2,num1-num2)
3.}
4.var result = sumAndMinus(10,20)
5.result.sum
6.result.minus
代碼2:
1.func sumAndMinus(num1:Int,num2:Int, inout sum:Int, inout minus:Int){
2.  sum = num1+num2
3.minus =num1-num2)
4.}
5.var sum = 0,minus = 0
6.sumAndMinus(20,5,&sum,&minus)
7.sum
8.minus
相關文章
相關標籤/搜索