Swift初學(xué)體驗(yàn)

學(xué)習(xí)總結(jié)

    學(xué)習(xí)了兩周的Swift,第一周算是對(duì)Swift有了一個(gè)初步的認(rèn)識(shí),體會(huì)了Swift語(yǔ)言開(kāi)發(fā)的過(guò)程以及可視化開(kāi)發(fā)的便利,算是一個(gè)愉快的開(kāi)始,第二周就是鋪天蓋地的循環(huán),數(shù)組這些必須要掌握的語(yǔ)法,尤其是周三周四這兩天的連綿不絕的練習(xí),讓我覺(jué)得在這里學(xué)習(xí)努力是不夠的,要爆肝才行??!不過(guò),連著學(xué)了一周的語(yǔ)法,還是學(xué)到了一點(diǎn)東西的。

初識(shí)Swift

    作為一門(mén)發(fā)布了兩年就能排在15名之前的語(yǔ)言,雖然有蘋(píng)果火熱的原因,但Swift必然也有它獨(dú)特的魅力。作為一個(gè)初學(xué)者,我體會(huì)不到它怎樣能成為20年內(nèi)編程語(yǔ)言的霸主,不過(guò)既然這么多人追捧,就姑且認(rèn)為它確實(shí)很牛逼。
    不過(guò)一句簡(jiǎn)單的打印"Hello,world!"的程序,卻是還是感覺(jué)不錯(cuò)的,至少比起其他語(yǔ)言的一大串要好的多。Swift支持代碼預(yù)覽,這個(gè)革命性的特性可以允許程序員在不編譯和運(yùn)行應(yīng)用程序的前提下運(yùn)行 Swift 代碼并實(shí)時(shí)查看結(jié)果,這對(duì)我們這些初學(xué)者來(lái)說(shuō)是很友好的東西。在定義一個(gè)變量或常量的時(shí)候設(shè)置可以不需要考慮類(lèi)型的問(wèn)題,Swift強(qiáng)大的類(lèi)型推斷能力就能搞定這一切。

變量和常量

使用let來(lái)聲明一個(gè)常量,使用var來(lái)聲明一個(gè)變量

例如:

var a = 1
let b = 2
var a = b

變量和常量的值永遠(yuǎn)不會(huì)被隱式轉(zhuǎn)換為其它類(lèi)型,如果需要把一個(gè)值轉(zhuǎn)換成其他類(lèi)型,需要顯示轉(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ù)信息的類(lèi)型

let stu:(id:Int,name:String,gender:Bool,age:Int) = (1001,"王鋼炮",true,21)
let (_,姓名,_,年齡) = stu
//元組取值從0開(kāi)始,下劃線(xiàn)表示忽略,取值時(shí)就可以跳過(guò)

用元組快捷交換兩個(gè)變量的值

(x,y) = (y,x)

標(biāo)識(shí)符的命名規(guī)則

  1. 字母(Unicode字符)、數(shù)字、下劃線(xiàn),數(shù)字不能開(kāi)頭
  2. 大小寫(xiě)敏感
  3. 不能使用關(guān)鍵字做標(biāo)識(shí)符
  4. 駝峰標(biāo)識(shí) - 第一個(gè)單詞全小寫(xiě)以后每個(gè)單詞首字母大寫(xiě)
  5. 見(jiàn)名知意

運(yùn)算符

1.算術(shù)運(yùn)算符(Arithmetic Operators)

算術(shù)運(yùn)算符主要有 + , - , * , / , % 五個(gè),還有自增(++)和自減(--)兩個(gè)在Swift3中即將刪掉的運(yùn)算符
算術(shù)運(yùn)算符的要求就是左右兩邊的類(lèi)型必須一樣,不然無(wú)法運(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,沒(méi)有四舍五入!

2.比較運(yùn)算符(comparison Operators)

比較運(yùn)算符又叫關(guān)系運(yùn)算符,有 > , < , == , != , >= , <=六種,產(chǎn)生Bool類(lèi)型的值,要么是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語(yǔ)句,可以讓代碼更簡(jiǎn)潔。

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來(lái)進(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è)無(wú)業(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來(lái)進(jìn)行循環(huán)。包裹條件和循環(huán)變量括號(hào)可以省略,語(yǔ)句的大括號(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í)讓人爽了一把。智商余額不足的我每次看到其他人寫(xiě)出來(lái)而自己連思路都沒(méi)有確實(shí)很揪心。但是在痛苦的過(guò)程中,確實(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è)簡(jiǎn)單的猜數(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è)問(wèn)題。計(jì)算機(jī)強(qiáng)就強(qiáng)在運(yùn)算快,不易出錯(cuò)。
100錢(qián)買(mǎi)100雞的問(wèn)題
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ù)組主要是排序問(wèn)題
swift 強(qiáng)大的功能使得這一問(wèn)題變得非常簡(jiǎn)單,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ù)雜的方法來(lái)提升自己
除了用sort函數(shù),我們還有兩種方法可以排序

簡(jiǎn)單選擇排序法

簡(jiǎn)單排序是定義(假設(shè)?)數(shù)組的第一個(gè)數(shù)為最小的數(shù),依次與數(shù)組里的數(shù)進(jìn)行比較,小的放前面,循環(huán)次數(shù)為數(shù)組里元素的個(gè)數(shù)

//簡(jiǎn)單選擇排序

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)過(guò)一周的學(xué)習(xí),我清楚的認(rèn)識(shí)到我與其他同學(xué)尤其是與10k的差距,確實(shí)讓人有點(diǎn)沮喪。不過(guò)沒(méi)辦法,既來(lái)之則安之,既然奔著學(xué)(shi)習(xí)(k)編(gao)程(xin)來(lái)的,就一定要搞定它!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容