Swift學習總結(jié)
現(xiàn)在學習Swift這門語言也兩周了,也算開了個頭了,剛開始學習可能對以前有過其它語言學習經(jīng)驗的人來說不是很習慣,但是慢慢入門了,習慣了它的開發(fā)環(huán)境和語法結(jié)構(gòu)也就會好很多。那現(xiàn)在我就總結(jié)一下我這兩周的學習內(nèi)容吧。
一、Swift學習環(huán)境
1.首先你要有一臺裝有OS-X系統(tǒng)的電腦
2.再然后就是下載Swift開發(fā)工具X-code,我們現(xiàn)在用的是7.2版本
3.一切就緒之后就可以新建一個工程了

現(xiàn)在我們建的ios應用,那么就選中圖上的(ios Application),然后選擇單視圖應用( Single View Application),當然如果你要做其它類型的應用你可以選擇其它os-X\tvOS等等


上述工作做完之后,點擊next進入如下界面。第一項為項目名稱,最好用全英文;第二項組織、公司名稱;第三項公司或個人網(wǎng)站域名,倒著寫,如果你的app上線,那么這就是它的唯一標識,其它的我想也不用過多介紹了。

這些都搞完之后點next,下個頁面選擇創(chuàng)建項目的儲存路徑,整個工程就完成了。
二、Swift語法
1.基本語法
標識符的命名規(guī)則
- 字母(Unicode字符)、數(shù)字、下劃線,數(shù)字不能開頭
- 大小寫敏感
- 不能使用關(guān)鍵字做標識符
- 駝峰標識 - 第一個單詞全小寫以后每個單詞首字母大寫
- 見名知意
2.數(shù)據(jù)類型
1.Int類型(整型)
分為Int和UInt(無符號整型),有8位,16位,32位,64位,當然Int 和UInt取值范圍是不一樣的。
print(Int8.max) // 2^7-1
print(Int8.min)// -2^7
print(UInt8.max) //2^8-1
print(UInt8.min) //0
2.浮點數(shù)Float和Double
Float(單精度浮點數(shù))表示32位浮點數(shù)、Double(雙精度浮點數(shù))表示64位浮點數(shù)
123 = 1*10^2 + 2*10^1 + 3*10^0
x = 101 // 十進制
print(x)
5 = 1*2^2 + 0*2^1 + 1*2^0
x = 0b101 // 二進制(binary)
print(x)
65 = 1*8^2 + 0*8^1 + 1*8^0
x = 0o101 // 八進制(octal)
print(x)
257 = 1*16^2 + 0*16^1 + 1*16^0
x = 0x101 // 十六進制(hexadecimal)
print(x)
用科學計數(shù)法表示小數(shù)
y = 1.23e4
print(y) // 12300.0
y = 1.23e-4
print(y) // 0.000123
3.Bool類型
布爾類型只有兩種值,即true和false。
4.字符串類型
"Hello,world!"
正常情況下表示整數(shù)首選Int,表示小數(shù)首選Double,表示字符串首選String,表示真假首選Bool
3.常量和變量
用let定義常量,用var定義變量;常量和變量可以用字母、下劃線、數(shù)字命名,但是不能已數(shù)字開頭。
let constA: Double = 2.25
print(constA)
var varB:Float
varB = 3.14159
print(varB)
4.運算符
Swift中運算符由算術(shù)運算符、關(guān)系運算符、短路運算符、賦值運算符、位運算符等組成。
1.算術(shù)運算符
+、-、*、/、%
==算術(shù)運算符兩邊數(shù)據(jù)類型必須一致;整數(shù)除以整數(shù)不會有小數(shù)部分;整數(shù)除以0產(chǎn)生運行事異常,小數(shù)除以0可能的結(jié)果是inf/-inf/nan==
我們還經(jīng)常會用到字符串插值:
print("\(a) + \(b) = \(a + b)")
print("\(a) - \(b) = \(a - b)")```
2.關(guān)系運算符
<、 > 、<=、 >=、 ==、 !=
3.短路運算符
&&(短路與)、||(短路或)、!(非)
4.賦值運算符
簡單賦值運算符:=
復合賦值運算符:+=、-=、*=、/=、%=
5.三元條件運算符
c = a < b ? a : b(如果a<b為true則c = a,否則c = b)
###5.分支結(jié)構(gòu)
if 語句
if else語句
if...elseif...else 語句
switc...case語句
###6.循環(huán)結(jié)構(gòu)
while 循環(huán)(有可能一次都不執(zhí)行)
repeat...while...循環(huán)(至少執(zhí)行一次)
for 循環(huán)
下面介紹幾個利用循環(huán)-分支結(jié)構(gòu)解決問題的實例
1.水仙花數(shù) - 153 = 1^3 + 5^3 + 3^3
//找出100-999之間所有的水仙花數(shù)
//作用域: 變量或常量只在定義它的花括號中起作用
//GET:變量或常量的作用域越小越好
//GET:能用常量的地方就不使用變量(編譯器會優(yōu)化代碼)
func cube(n: Int) -> Int{
return n * n * n
}
for a in 100...999{
let c = a / 100 //百位
let d = (a % 100)/10 //十位
let f = a % 10 //個位
if a == cube(c) + cube(d) + cube(f){
print(a)
}
}
2.猜數(shù)字
let answer = Int(arc4random_uniform(100)) + 1
var thyAnswer: Int
var counter = 0
repeat{
counter += 1
print("請輸入你猜的數(shù)字:",terminator: "")
thyAnswer = inputInt()
if thyAnswer > answer
{
print("小一點")
}
else if thyAnswer < answer{
print("大一點")
}
else {
print("恭喜你猜對了!你總共猜了\(counter)次")
}
} while thyAnswer != answer
if counter > 7{
print("你的智商該充值了!")
}
3.Craps賭博游戲
func roll() -> Int{
return Int(arc4random_uniform(6)) + 1
}
var money = 100000
repeat{
print("玩家總資產(chǎn): ¥(money)元")
var debt: Int
repeat{
print("請下注:", terminator: "")
debt = inputInt()
}while debt <= 0 || debt > money
var needsGoon = false
let firstPoint = roll() + roll()
print("玩家搖出了(firstPoint)點")
switch firstPoint {
case 7, 11:
print("玩家勝!")
money += debt
case 2, 3, 12:
print("莊家勝!")
money -= debt
default:
needsGoon = true //游戲繼續(xù)
}
while needsGoon{
let currentPoint = roll() + roll()
print("玩家搖出了\(currentPoint)點")
if currentPoint == 7{
print("莊家勝!")
money -= debt
needsGoon = false
}
else if currentPoint == firstPoint {
print("玩家勝!")
money += debt
needsGoon = false
}
}
}while money > 0
print("你破產(chǎn)了!!!")
4.百錢買百雞
GTE:窮舉法(窮盡所有的可能性直到找到正確答案)
for x in 0...20{
for y in 0...33{
let z = 100 - x - y
if 5 * x + 3 * y + z / 3 == 100 && z % 3 == 0{
print("公雞:(x),母雞:(y),小雞:(z)")
}
}
}
5.打印菱形
print("row = ",terminator: "")
let row = inputInt()
for i in 0..<row{
//通過行號計算出星星的數(shù)量和空格的數(shù)量
//先打印空格再打印星星就可以了
let star: Int
let space: Int
if i <= row/2 { //上半部分
star = 2 * i + 1
}else{ //下半部分
star = 2 * (row - i) - 1
}
space = (row - star)/2
for j in 0..<space{
print(" ",terminator: "")
}
for j in 0..<star{
print("*",terminator: "")
}
print("")
}

###5.數(shù)組
1.數(shù)組的定義和初始化
創(chuàng)建數(shù)組的方法很多,下面介紹這幾種:
var array1 = Int
var array2:[Int] = []
var array3 = [99,12,34,166,7]
var array4 = [Int](count: 100, repeatedValue: 1)
2.獲取數(shù)組元素個數(shù)
print(array1.count)
print(array2.count)
print(array3.count)
3.對數(shù)組中的元素進行遍歷
for i in 0..<array3.count{
//[]是對數(shù)組進行下標運算(取出指定位置的元素)
print(array3[i])
if i == 1{
array3[1] = 520
}
}
print(array3)
//只讀循環(huán)(在循環(huán)過程中不能修改數(shù)組元素)
for str in array7{
print(str)
}
//用元組索引
var array7 = ["apple","orange","banana"]
for (index, value) in array7.enumerate(){
print("(index). (value)")
}

4.向數(shù)組中添加元素
var array5: [String] = []
array5.append("strawberry")
array5.append("pear") //追加
array5 += ["eggs"]
array5.insert("waxberry", atIndex: 0)
array5.insert("watermelon", atIndex: 2)
array5.insert("lemon", atIndex: array5.count)//插入
print(array5)

var array5 = ["waxberry", "strawberry", "watermelon", "pear", "eggs", "lemon"]
array5.removeAtIndex(4)
array5.removeFirst()
print(array5)
array5.removeAll()
print(array5)
6.數(shù)組的復制
var array7 = ["apple","orange","banana"]
var array9 = array7
array9[0] = "pitaya"
print(array9)
var array10 = array9[1...2]
print(array10)
let array11 = array9 + array5
print(array11)
例1//用數(shù)組輸出斐波拉契數(shù)列
var fibArray = [Int](count: 20, repeatedValue: 0)
fibArray[0] = 1
fibArray[1] = 1
for i in 2..<fibArray.count{
fibArray[i] = fibArray[i - 1] + fibArray[i - 2]
}
//1.
for (index,value) in fibArray.enumerate(){
print("(index + 1).(value)")
}
//2.
for i in 0..<fibArray.count{
print(fibArray[i])
}
//3.
for num in fibArray{
print(num)
}
例2:簡單選擇排序:每次從剩下的元素中找最小的元素放到對應的位置上
for i in 0..<array.count - 1{
var minIndex = i
for j in i + 1..<array.count{
if array[j] < array[minIndex]{
minIndex = j
}
}
(array[i],array[minIndex]) = (array[minIndex],array[i])
}
print(array)
例3:冒泡排序:
for i in 0..<array.count - 1{
var swapped = false //當前這輪沒有發(fā)生過兩兩交換
for j in 0..<array.count - 1 - i{
if array[j] > array[j + 1]{
(array[j],array[j+1]) = (array[j+1],array[j])
swapped = true
}
}
//沒有發(fā)生過兩兩交換則終止循環(huán)
if swapped == false{
break
}
}
print(array)
##三、App制作
由于開發(fā)過程細節(jié)較多,這里舉一個簡單的例子來介紹可視化開發(fā)過程:
1.首先你要建一個ios application的工程,工程建好后,工程文件夾是這樣的

2.我們在Main.storyboard(主故事板)目錄構(gòu)建app用戶界面
比如我們要做一個用戶登錄的界面,如下圖:

首先點擊屏幕上方的ViewController打開屬性檢查器,調(diào)整size即屏幕尺寸,最右上那三個框可以打開左右和底部邊欄。然后點擊對象庫,選中你需要添加的對象,拖動到屏幕上就添加到用戶界面上了,現(xiàn)在我們添加的是兩個text(文本框)和一個按鈕(button)。
3.添加完畢后打開輔助編譯器,如下圖:

根據(jù)圖上的方法,把對象拖到右邊松開ctrl鍵是這樣的

點擊connection,可以展開幾個選項text就選Outlet,button選擇Action,將三個對象都添加完畢后就可以在相應對象代碼里面寫事件代碼了。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
}
@IBOutlet weak var admin: UITextField!
@IBOutlet weak var password: UITextField!
@IBAction func loginButton(sender: AnyObject) {
//自動去掉文本框里的空格
admin.text = admin.text!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
let userName = admin.text!
let passWord = password.text!
//三元條件運算符
let msg = userName == "admin" && passWord == "123456" ? "登陸成功!" : "非法用戶!"
let alertController = UIAlertController(title: "溫馨提示", message: msg, preferredStyle: .Alert)
let loadAction = UIAlertAction(title: "確定", style: .Default, handler: nil)
alertController.addAction(loadAction)
self.presentViewController(alertController, animated: true, completion: nil)
}
//一觸摸屏幕就執(zhí)行函數(shù)
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
if admin.isFirstResponder(){
admin.resignFirstResponder()
}
if password.isFirstResponder(){
password.resignFirstResponder()
}
}
}
4.在模擬器上運行效果
