學(xué)習(xí)總結(jié)
學(xué)習(xí)了兩周的Swift采章,第一周算是對(duì)Swift有了一個(gè)初步的認(rèn)識(shí),體會(huì)了Swift語言開發(fā)的過程以及可視化開發(fā)的便利壶辜,算是一個(gè)愉快的開始悯舟,第二周就是鋪天蓋地的循環(huán),數(shù)組這些必須要掌握的語法士复,尤其是周三周四這兩天的連綿不絕的練習(xí)图谷,讓我覺得在這里學(xué)習(xí)努力是不夠的,要爆肝才行摆搴椤便贵!不過,連著學(xué)了一周的語法冗荸,還是學(xué)到了一點(diǎn)東西的承璃。
初識(shí)Swift
作為一門發(fā)布了兩年就能排在15名之前的語言,雖然有蘋果火熱的原因蚌本,但Swift必然也有它獨(dú)特的魅力盔粹。作為一個(gè)初學(xué)者隘梨,我體會(huì)不到它怎樣能成為20年內(nèi)編程語言的霸主,不過既然這么多人追捧舷嗡,就姑且認(rèn)為它確實(shí)很牛逼轴猎。
不過一句簡單的打印"Hello,world!"的程序,卻是還是感覺不錯(cuò)的进萄,至少比起其他語言的一大串要好的多捻脖。Swift支持代碼預(yù)覽,這個(gè)革命性的特性可以允許程序員在不編譯和運(yùn)行應(yīng)用程序的前提下運(yùn)行 Swift 代碼并實(shí)時(shí)查看結(jié)果中鼠,這對(duì)我們這些初學(xué)者來說是很友好的東西可婶。在定義一個(gè)變量或常量的時(shí)候設(shè)置可以不需要考慮類型的問題,Swift強(qiáng)大的類型推斷能力就能搞定這一切援雇。
變量和常量
使用let來聲明一個(gè)常量矛渴,使用var來聲明一個(gè)變量
例如:
var a = 1
let b = 2
var a = b
變量和常量的值永遠(yuǎn)不會(huì)被隱式轉(zhuǎn)換為其它類型,如果需要把一個(gè)值轉(zhuǎn)換成其他類型惫搏,需要顯示轉(zhuǎn)換具温。
let label = "The width is"
let width = 94
let widthlabel = label + String(width)
還有一種把值轉(zhuǎn)換為字符串的方法叫做 “字符串插值”
let day = 6
let today = "今天是星期\(day)"
元組(Tuples)
用一個(gè)變量或者一個(gè)常量保存多項(xiàng)數(shù)據(jù)信息的類型
let stu:(id:Int,name:String,gender:Bool,age:Int) = (1001,"王鋼炮",true,21)
let (_,姓名,_,年齡) = stu
//元組取值從0開始,下劃線表示忽略晶府,取值時(shí)就可以跳過
用元組快捷交換兩個(gè)變量的值
(x,y) = (y,x)
標(biāo)識(shí)符的命名規(guī)則
- 字母(Unicode字符)桂躏、數(shù)字、下劃線川陆,數(shù)字不能開頭
- 大小寫敏感
- 不能使用關(guān)鍵字做標(biāo)識(shí)符
- 駝峰標(biāo)識(shí) - 第一個(gè)單詞全小寫以后每個(gè)單詞首字母大寫
- 見名知意
運(yùn)算符
1.算術(shù)運(yùn)算符(Arithmetic Operators)
算術(shù)運(yùn)算符主要有 + , - , * , / , % 五個(gè)剂习,還有自增(++)和自減(--)兩個(gè)在Swift3中即將刪掉的運(yùn)算符
算術(shù)運(yùn)算符的要求就是左右兩邊的類型必須一樣,不然無法運(yùn)算,有趣的是较沪,swift里還可以進(jìn)行字符串的 + 運(yùn)算鳞绕。
關(guān)于整數(shù)的除運(yùn)算,也有一點(diǎn)要注意尸曼;整數(shù)除以整數(shù)的商就是結(jié)果的整數(shù)部分们何,所以321除以100結(jié)果就是3,355除以100結(jié)果也等于3而不是4控轿,沒有四舍五入冤竹!
2.比較運(yùn)算符(comparison Operators)
比較運(yùn)算符又叫關(guān)系運(yùn)算符,有 > , < , == , != , >= , <=六種茬射,產(chǎn)生Bool類型的值鹦蠕,要么是true,要么是false在抛!
let name = "world"
if name == "world" {
print("hello, world")
} else {
print("I'm sorry \(name), but I don't recognize you"
}
3.三元條件運(yùn)算符(Ternary conditional Operator)
三元運(yùn)算符的格式大概就是(question ? answer1 : answer2) 前面的question如果成立钟病,就執(zhí)行answer1,如果不成立,就執(zhí)行answer2
有了三元運(yùn)算符肠阱,就可以替代很多的if語句票唆,可以讓代碼更簡潔。
4.短路運(yùn)算符(Logical Operator)
邏輯與(Logical And) &&
邏輯或(Loical Or) ||
邏輯非(Logical Not) !
let year = 1344
if ( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 {
print("\(year)年是閏年")
}
else {
print("\(year)年不是閏年")
}
分支結(jié)構(gòu)
使用if和switch來進(jìn)行條件操作屹徘,主要有
if{
}
else{
}
以及
switch{
case:
case:
default:
}
這兩種結(jié)構(gòu)都可以套用if-else里面可以套用switch-case走趋,switch-case里也可以套用if-else的結(jié)構(gòu),當(dāng)然if-else也能套用if-else噪伊。
比如:
// IT從業(yè)人員等級(jí)評(píng)定
print("請(qǐng)輸入你的月薪: ", terminator: "")
let salary = inputInt()
if salary >= 0 {
switch salary {
case 0:
print("你是一個(gè)無業(yè)游民")
case 1...30000:
print("你是一個(gè)小碼畜")
case 30001...60000:
print("你是一個(gè)小碼奴")
case 60001...100000:
print("你是一個(gè)大碼農(nóng)")
case 100001...200000:
print("你是一個(gè)光榮的IT民工")
case 200001...500000:
print("你是一個(gè)優(yōu)秀的IT工程師")
case 500001..<10000000:
print("你是IT精英")
case 10000000..<100000000:
print("你是IT大哥, 我服")
default:
print("你是頭上有光環(huán)的IT領(lǐng)袖, 求帶")
}
}
else {
print("你丫有病!!!")
}
循環(huán)結(jié)構(gòu)
使用for_in吆视、for、while酥宴、和repeat - while來進(jìn)行循環(huán)。包裹條件和循環(huán)變量括號(hào)可以省略您觉,語句的大括號(hào)還是必須的拙寡。
repeat-while
//repeat-while循環(huán) - 至少執(zhí)行一次
var i = 1
repeat {
print("\(i). Hello, world!")
i += 1
} while i <= 100
while
//while循環(huán) - 有可能一次都不執(zhí)行
var i = 1
while i <= 10 {
print("\(i). Hello, world!")
i += 1
}
for - in
// for循環(huán)
for _ in 1..<10 {
print("Hello, world!")
}
在練習(xí)這一段的時(shí)候,差不多兩天的時(shí)間不停的練習(xí)琳水,確實(shí)讓人爽了一把肆糕。智商余額不足的我每次看到其他人寫出來而自己連思路都沒有確實(shí)很揪心。但是在痛苦的過程中在孝,確實(shí)還是學(xué)到了一些東西诚啃。
let answer = Int(arc4random_uniform(1000)) + 1
var thyAnswer: Int
var counter = 0
repeat{
counter += 1
print("請(qǐng)輸入你的答案:", terminator: "")
thyAnswer = inputInt()
if thyAnswer > answer{
print("大了")
}else if thyAnswer < answer{
print("小了")
}else{
print("你猜中了,你猜了\(counter)")
}
}while thyAnswer != answer
if counter > 7{
print("你的智商需要充值!")
}
一個(gè)簡單的猜數(shù)字的游戲用到了repeat-while,怎么用私沮,放在哪里都可以讓我琢磨許久始赎。
// Craps賭博游戲
func roll() -> Int {
return Int(arc4random_uniform(6)) + 1
}
var money = 1000
repeat {
print("玩家總資產(chǎn): ¥\(money)元")
var debt: Int
repeat {
print("請(qǐng)下注: ", terminator: "")
debt = inputInt()
} while debt <= 0 || debt > money
var needsGoOn = false
let firstPoint = roll() + roll()
print("玩家搖出了\(firstPoint)點(diǎn)")
switch firstPoint {
case 7, 11:
money += debt
print("玩家勝!!!")
case 2, 3, 12:
money -= debt
print("莊家勝!!!")
default:
needsGoOn = true // 游戲繼續(xù)
}
while needsGoOn {
let currentPoint = roll() + roll()
print("玩家搖出了\(currentPoint)點(diǎn)")
if currentPoint == 7 {
money -= debt
print("莊家勝!!!")
needsGoOn = false
}
else if currentPoint == firstPoint {
money += debt
print("玩家勝!!!")
needsGoOn = false
}
}
} while money > 0
print("你破產(chǎn)了!!!")
這個(gè)賭博游戲更是把這幾天所學(xué)的知識(shí)全都用上了,代碼的規(guī)范仔燕,函數(shù)的使用造垛,循環(huán),分支的結(jié)構(gòu)全都涉及到了晰搀。
除此之外五辽,還get到了一個(gè)很重要的東西——窮舉法:窮盡所有的可能性直到找到正確答案),這就是按照人的思維去算外恕,但是人的運(yùn)算速度有限杆逗,計(jì)算某些事情需要耗費(fèi)太多時(shí)間而且容易出錯(cuò)。這里鳞疲,用計(jì)算機(jī)使用窮舉法就可以完美解決這個(gè)問題罪郊。計(jì)算機(jī)強(qiáng)就強(qiáng)在運(yùn)算快,不易出錯(cuò)建丧。
100錢買100雞的問題
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)")
}
}
}
數(shù)組
數(shù)組主要是排序問題
swift 強(qiáng)大的功能使得這一問題變得非常簡單排龄,sort函數(shù)輕松解決
let newArray = array.sort(>)//排序后產(chǎn)生一個(gè)新數(shù)組
print(array)
print(newArray)
array.sortInPlace()//就在這個(gè)數(shù)組排序
print(array)
但是只會(huì)使用函數(shù)永遠(yuǎn)也不能進(jìn)步,所以我們需要更復(fù)雜的方法來提升自己
除了用sort函數(shù),我們還有兩種方法可以排序
簡單選擇排序法
簡單排序是定義(假設(shè)橄维?)數(shù)組的第一個(gè)數(shù)為最小的數(shù)尺铣,依次與數(shù)組里的數(shù)進(jìn)行比較,小的放前面争舞,循環(huán)次數(shù)為數(shù)組里元素的個(gè)數(shù)
//簡單選擇排序
var array = ["faker","amazingj","condi","clearlove","martin","looper","swift","easyhoon",]
for i in 0..<array.count - 1{
var minIndex = i
for i in i+1..<array.count{
if array[i] < array[minIndex]{
minIndex = i
}
}
(array[i],array[minIndex]) = (array[minIndex],array[i])
}
print(array)
冒泡排序法
冒泡排序:兩兩比較凛忿,前面的元素比后面的元素大就交換位置,再加上優(yōu)化竞川,排序完成就可以停止循環(huán)店溢。適合只有少數(shù)順序不對(duì)的數(shù)組。
var array = [56,37,68,23,99,27,6,77]
for i in 0..<array.count-1{
var swapped = false
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
}
if swapped == false{
break
}
}
}
print(array)
經(jīng)過一周的學(xué)習(xí)委乌,我清楚的認(rèn)識(shí)到我與其他同學(xué)尤其是與10k的差距床牧,確實(shí)讓人有點(diǎn)沮喪。不過沒辦法遭贸,既來之則安之戈咳,既然奔著學(xué)(shi)習(xí)(k)編(gao)程(xin)來的,就一定要搞定它壕吹!