Swift3.0 入門教程

Swift 語言是蘋果公司在2014年的 WWDC 大會(huì)上發(fā)布的全新的編程語言速挑。Swift 語言繼承了C語言以及Objective-C 的特性婶希,且克服了C語言的兼容性問題锅铅。Swift語言采用安全編程模式草娜,且引入了多種新功能陪踩,使得編程工作更加簡便咐低,靈活揽思!

本文只是結(jié)合自己的開發(fā)經(jīng)驗(yàn)簡單的對(duì) Swift 語言進(jìn)行一個(gè)入門基礎(chǔ)語法介紹,如果想要深入的學(xué)習(xí) Swift 见擦,可以查看蘋果公司提供的教程 The Swift Programming Language (Swift 3) 钉汗。文章代碼均使用 Swift 3.0 演示,可以去 github下載源碼鲤屡,用 Xocde 打開即可损痰。

01-變量和常量

/***************************基本數(shù)據(jù)類型*************************/
/**************************************************************
    1.整數(shù):  Int
    2.浮點(diǎn)數(shù): Double表示64位浮點(diǎn)數(shù),Float表示32位浮點(diǎn)數(shù)
    3.布爾類型: Bool,布爾值只有 true 和 false 兩種
    4.字符串: String
    5.字符: Character
***************************************************************/

/***************************變量和常量*************************/
/***************************************************************
    1.變量:值能被修改,var 修飾
    2.常量:值不能被修改,let 修飾
***************************************************************/
var a = 20
a = 10
let b = 20
//b = 10  常量不能修改:error:'b' is a 'let' constant

/****************************************************************
    1.會(huì)自動(dòng)推導(dǎo)聲明的變量或常量的屬性
    2.使用【option + 單擊】鍵查看屬性的類型,效果圖見:Resources/查看屬性.png
****************************************************************/
// 1.自動(dòng)推導(dǎo)類型
let str = "ningcol"
let intValue = 10
let floatValue = 1.2

// 2.指定數(shù)據(jù)類型
let doubleValue:Double = 10

02-運(yùn)算符

/**************************基本運(yùn)算符*************************/
var a = 5
let b = 3

// 1.賦值運(yùn)算符
let c = b

// 2.加減乘除
1 + 2
5 - 3
2 * 3
10.0 / 2.5

// 2.1 任何情況下都不會(huì)做隱式轉(zhuǎn)化酒来,必須以相同類型進(jìn)行計(jì)算
let num1 = 1
let num2 = 2.2
let num3 = Double(num1) + num2

// 2.2 必須要顯式類型的轉(zhuǎn)化
let j = 2.2
let i:Float = 1.2
i + Float(j)

// 3.求余運(yùn)算
a % b

// 4.負(fù)號(hào)運(yùn)算
let minusB = -b

// 5.組合賦值運(yùn)算
a += 2

// 6.比較運(yùn)算
1 == 1
2 != 1
2 > 1
1 < 2
1 >= 1
2 <= 1

// 7.三目運(yùn)算
let d = a > b ? 100 : 200

// 8.空合運(yùn)算(Nil Coalescing Operator)
/*********************************************************************
    1.空合運(yùn)算符( a ?? b )將對(duì)可選類型 a 進(jìn)行空判斷(可選項(xiàng)內(nèi)容詳見:04-可選項(xiàng))
    2.如果 aName 為 nil卢未,則執(zhí)行??后面的,否則執(zhí)行aName(注意??兩邊都有空格)   
********************************************************************/
var aName: String? = "ningcol"
//var aName: String? = nil
let bName = aName ?? "aNameIsNil"

// 9.區(qū)間運(yùn)算
/*********************************************************************
    1.閉區(qū)間運(yùn)算符( a...b )定義一個(gè)包含從 a 到 b (包括 a 和 b )的所有值的區(qū)間
    2.半開區(qū)間( a..<b )定義一個(gè)從 a 到 b 但不包括 b 的區(qū)間
 ********************************************************************/
for index in 1...5 {
    print(index)
}

for index in 1..<5 {
    print("半開區(qū)間:\\(index)")
}

// 10.邏輯運(yùn)算
/*********************************************************************
    1.邏輯非(!a):布爾值取反
    2.邏輯與( a && b ):只有 a 和 b 的值都為 true 時(shí)堰汉,整個(gè)表達(dá)式的值才會(huì)是 true
    3.邏輯或( a || b ):兩個(gè)邏輯表達(dá)式的其中一個(gè)為 tru e 辽社,整個(gè)表達(dá)式就為 true
 ********************************************************************/
let allowedEntry = false
let enteredDoorCode = true

if !allowedEntry {
    print("ACCESS DENIED")
}

if allowedEntry && enteredDoorCode {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}

if allowedEntry || enteredDoorCode {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}

03-可選項(xiàng)


/***************************可選項(xiàng)*************************/
/*********************************************************************
    1.可選值:可以有值,可以為nil(用 ? 表示可選值)
 ********************************************************************/
// URL 為可選項(xiàng)
let URL = NSURL(string: "http://www.baidu.com/")

// str 為可選項(xiàng)
var str: String? = "ningcol"

// var 的可選項(xiàng)默認(rèn)為 nil
var a:Int?
print(a)

/*************************** if let *************************/
// if let : 確保 myUrl 有值,才會(huì)進(jìn)入分支
if let myUrl = URL{
    print(myUrl)
}

var aName: String? = "ningcol"
// var aName: String? = nil
var aAge: Int? = 18

if let name = aName,let age = aAge {
    print(name + String(age))
}
// 可以對(duì)值進(jìn)行修改
if var name = aName,let age = aAge {
    name = "lisi"
    print(name + String(age))
    
}
/*************************** guard let *************************/
/*********************************************************************
    1.guard let 和 if let 相反翘鸭。表示一定有值,沒有就直接返回
    2.降低分支層次結(jié)構(gòu)
    3.playground不能展示效果爹袁,要在函數(shù)中展示
********************************************************************/
// 創(chuàng)建一個(gè)類(詳見:10-對(duì)象和類)
class test{
    func demo(){
        let aNick: String? = "ningcol"
        let aAge: Int? = 10
        guard let nick = aNick ,let age = aAge  else {
            print("nil")
            return
        }
        print("guard let: " + nick + String(age))
    }

}
var t = test()
t.demo()

/*******************************強(qiáng)制解包***************************************/
// 創(chuàng)建一個(gè)數(shù)組(詳見:08-組數(shù))
var dataList:[String]?
dataList = ["zhangsan","lisi"]
/*********************************************************************
    1.dataList? 表示 datalist 可能為 nil
    2.如果為 nil, .count 不會(huì)報(bào)錯(cuò),仍然返回 nil
    2.如果不為 nil矮固,.count執(zhí)行失息,返回?cái)?shù)組元素個(gè)數(shù)
    4. ?? 空合運(yùn)算符(詳見:02-運(yùn)算符)
*********************************************************************/
let count = dataList?.count ?? 0

// 表示 datalist 一定有值,否則會(huì)出錯(cuò)譬淳!
let cou = dataList!.count

04-條件語句

/**************************if語句*************************/
/*********************************************************************
    1.必須要有大括號(hào)
    2.沒有"非零即真"的概念,只有ture/false
*********************************************************************/
let num = 20
if num > 10{
    print("大于10");
}else{
    print("小于或等于10")
}

/**************************switch*************************/
/*********************************************************************
    1.值可以是任何類型
    2.作用域僅在 case 內(nèi)部
    3.不需要 break
    4.每一個(gè) case 都要有代碼
*********************************************************************/
let name = "nick"

switch name {
case "nick":
    let age = 18
    print("one  \\(age)")
case "fil":
    print("two")
case "Davi":
    print("three")
case "": break  //相當(dāng)于有一行代碼
case "tom","ningcol":
    print("tomAndNingcol")
default:
    print("other")
}

05-循環(huán)

/***************************for循環(huán)*************************/
// 去掉了C語言風(fēng)格的循環(huán)( ..< 區(qū)間運(yùn)算符,詳見:02-預(yù)算符)
for i in 0..<10{
    print(i)
}

print("----步長循環(huán)-----")
// 遞增(步數(shù)為2)
for i in stride(from: 0, to: 12, by: 2) {
    print(i)
}
// 遞減
for i in stride(from: 12, to: 0, by: -2) {
    print(i)
}

print("----反序循環(huán)----")
let range = 0...10
// 反序循環(huán)
for i in range.reversed(){
    print(i)
}

/***************************while循環(huán)*************************/
print("----while循環(huán)----")
var n = 2
while n < 100 {
    n=n * 2
}
print(n)

/***************************epeat-while循環(huán)*************************/
//它和 while 的區(qū)別是在判斷循環(huán)條件之前盹兢,先執(zhí)行一次循環(huán)的代碼塊邻梆。然后重復(fù)循環(huán)直到條件為 false
var m = 2
repeat {
    m = m * 2
} while m < 100
print(m)

06-字符串

/**********************************************************************
    1.String 結(jié)構(gòu)體,效率比對(duì)象高绎秒,一般推薦使用浦妄,支持遍歷
    2.NSString 繼承NSObject
**********************************************************************/
var str:String = "Hello你好"
//var st:NSString = "hah"
// 字節(jié)數(shù)量
print(str.lengthOfBytes(using: .utf8))
// 字符串長度
print(str.characters.count)
for a in str.characters{
    print(a)
}


// 字符串拼接
let name:String? = "老王"
let age = 80
let location = "隔壁"
print(location + (name ?? "a") + String(age) + "歲")
//  '\\(變量名)' 會(huì)自動(dòng)轉(zhuǎn)換拼接
print("\\(location)\\(name)\\(age)歲")


let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
print("\\(rect)")

// 格式字符串
let h = 13
let m = 5
let s = 9
let timeStr = String(format: "%02d:%02d:%02d", arguments: [h,m,s])
let timeStr1 = String(format: "%02d:%02d:%02d", h,m,s)

/**********************************************************************
    1.在Swift中使用 Range,最好把 String 改成 NSString
    2.str.substring(with: Range<String.Index>) 很麻煩
    3. '值 as 類型' 作為類型轉(zhuǎn)換
**********************************************************************/
(str as NSString).substring(with: NSMakeRange(2, 5))

let index = str.index(str.startIndex, offsetBy: 3)
str.substring(from: index)
// "123"只是用來取到索引位置
str.substring(from: "123".endIndex)
str.substring(to: index)

// String 使用 Range
let myRange = str.startIndex..<str.index(str.startIndex, offsetBy: 5)
str.substring(with: myRange)

let myRange1 = index..<str.index(str.startIndex, offsetBy: 5)
str.substring(with: myRange1)

07-元組

// 元組的元素個(gè)數(shù)固定见芹,不允許增加剂娄、刪除
var stu = (404,"小白")
// 支持嵌套
var msg = ("基本信息", ("李剛",34))
print(stu)
print(msg)

var (a,b) = stu
print(a,b)
//如果僅需要元組中的個(gè)別的值,可以使用"_"的方式來處理不需要的值
let (c,_) = stu
print(c)

//通過序號(hào)獲得元組的值
print("status is \\(stu.0)")

// 可以修改
stu.0 = 500

let message = (status: 100, msg:"哈哈")
print("message is \\(message.status)  and \\(message.msg)")

08-數(shù)組

/***************************數(shù)組定義*************************/
//方括號(hào) [] 來創(chuàng)建數(shù)組
let array1 = ["zhangsan","lisi"]

let array2 = [1,2,3,4,5]

var array3:[Int] // 定義一個(gè)數(shù)組(沒有初始化)
array3 = [Int]() //初始化
//聲明空數(shù)組,(必須初始化)
let array4 = [String]()  // 等價(jià)上面兩行代碼

let array5:[Any] = ["zhangsan","lisi",20]

var arr3 = [Double](repeating: 0.0, count: 3) //[0.0, 0.0, 0.0]
var arr4 = Array(repeating: 3.0, count: 3)  //[3.0, 3.0, 3.0]

var arr: [String] = ["Alex", "Brian", "Dave"]
print(arr.count)
print(arr[0])


/***************************數(shù)組遍歷*************************/
for name in array1{
    print(name)
}

for i in 0..<array2.count{
    print(array2[i])
}

// 同時(shí)遍歷下標(biāo)和內(nèi)容
for e in array2.enumerated(){
    print(e)
    print("元組 \\(e.offset) \\(e.element)")
}

// 反序遍歷
for a in array2.reversed(){
    print(a)
}

/***************************數(shù)組增刪改*************************/
// 追加
arr.append("ningcol")

// 合并(類型必須一致)
let arr1 = ["Evi","Tank"]
arr += arr1

// 修改
arr[0] = "Tom"
print(arr)

// 刪除
arr.removeFirst()
print(arr)

arr.remove(at: 2)
print(arr)

// 刪除全部并保留空間
arr.removeAll(keepingCapacity: true)
print(arr.capacity)  //數(shù)組容量

/***************************容量*************************/
// 容量每次都會(huì)在原來基礎(chǔ)上 * 2
print("初始容量 \\(array3.capacity)")
for i in 0..<8{
    array3.append(i)
    print("\\(array3)玄呛,容量:\\(array3.capacity)")
}

09-字典

/***************************字典定義*************************/
//方括號(hào) [] 來創(chuàng)建字典

let dict1 = ["name":"lisi","age":"18"]
// 不同類型必須指明為 any
var dict2:[String:Any] = ["name":"lisi","age":18]


let array = [
    ["name":"lisi","age":"18"],
    ["name":"wangwu","age":8]
]
print(array)
let array1:[[String:Any]] = [
    ["name":"lisi","age":"18"],
    ["name":"wangwu","age":8]
]
print(array1)

print(dict2["age"])

/***************************字典增刪改*************************/
// 增加
dict2["sex"] = "man"
print(dict2)
// 修改(通過key來取值阅懦,key不存在就是新增)
dict2["name"] = "zhangsan"
print(dict2)
// 刪除(直接給key進(jìn)行刪除)
dict2.removeValue(forKey: "age")
print(dict2)


/***************************字典遍歷*************************/
for e in dict2{
    //e 為元組
    print("字典遍歷:\\(e)  e.key:\\(e.key)  value:\\(e.value)")
}
// key value 可以隨意更改
for (key,value) in dict2{
    //e 為元組
    print("key:\\(key), value:\\(value)")
}

/***************************字典合并*************************/
var dict3:[String:Any] = ["name":"zhangsan","age":18,"sex":"man"]
let dict4:[String:Any] = ["name":"ningcol","height":50]
// 如果key存在修改  不存在會(huì)增加
for e in dict4{
    dict3[e.key] = dict4[e.key]
}
print("合并dict:" + String(format: "%@", dict3))


10-對(duì)象和類

// 創(chuàng)建一個(gè)類
class Shape {
    var numberOfSides = 0
    // 定義 simpleDescription 無參方法,返回值為 String 類型
    func simpleDescription() -> String {
        return "A shape with \\(numberOfSides) sides."
    }
}

// 實(shí)例化
var shape = Shape()
// 賦值
shape.numberOfSides = 7
// 調(diào)用方法
var shapeDescription = shape.simpleDescription()

//  構(gòu)造函數(shù)來初始化類實(shí)例
class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    init(name: String) {
        self.name = name
    }
    func simpleDescription() -> String {
        return "A shape with \\(numberOfSides) sides."
    }
}

// 重寫父類方法
class Square: NamedShape {
    var sideLength: Double
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    func area() ->  Double {
        return sideLength * sideLength
    }
    // 使用 override
    override func simpleDescription() -> String {
        return "A square with sides of length \\(sideLength)."
    } }
let test = Square(sideLength: 5, name: "my test square")
test.area()
test.simpleDescription()

11-控件

// 創(chuàng)建一個(gè) View
let v = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
let u = UIView()


// [UIColor redColor]   類方法:直接點(diǎn)出來
v.backgroundColor = UIColor.red


// 創(chuàng)建一個(gè)按鈕
let btn = UIButton(type: .contactAdd)


// 將 btn 添加到 View 上
btn.center = v.center
v.addSubview(btn)


16/10/11更新
添加函數(shù)、閉包兩個(gè)章節(jié)徘铝,詳情可在代碼地址查看

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末耳胎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惕它,更是在濱河造成了極大的恐慌怕午,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹魄,死亡現(xiàn)場離奇詭異郁惜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甲锡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門兆蕉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搔体,你說我怎么就攤上這事恨樟。” “怎么了疚俱?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵劝术,是天一觀的道長。 經(jīng)常有香客問我呆奕,道長养晋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任梁钾,我火速辦了婚禮绳泉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姆泻。我一直安慰自己零酪,他們只是感情好冒嫡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著四苇,像睡著了一般孝凌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上月腋,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天蟀架,我揣著相機(jī)與錄音,去河邊找鬼榆骚。 笑死片拍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的妓肢。 我是一名探鬼主播捌省,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼职恳!你這毒婦竟也來了所禀?” 一聲冷哼從身側(cè)響起方面,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤放钦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恭金,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操禀,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年横腿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颓屑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡耿焊,死狀恐怖揪惦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罗侯,我是刑警寧澤器腋,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站钩杰,受9級(jí)特大地震影響纫塌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讲弄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一措左、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧避除,春花似錦怎披、人聲如沸胸嘁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缴渊。三九已至,卻和暖如春鱼炒,著一層夾襖步出監(jiān)牢的瞬間衔沼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工昔瞧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留指蚁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓自晰,卻偏偏與公主長得像凝化,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酬荞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容