對(duì)于Swift的初步了解

我與Swift的第一次接觸

1. ?關(guān)于Swift

(1)簡(jiǎn)介

Swift 是一種新的編程語(yǔ)言,用于編寫 iOS 和 OS X 應(yīng)用。Swift 結(jié)合了 C 和 Objective-C 的優(yōu)點(diǎn)并且不受C兼容性的限制。Swift 采用安全的編程模式并添加了很多新特性,這將使編程更簡(jiǎn)單,更靈活,也更有趣。Swift 是基于成熟而且倍受喜愛得 Cocoa 和 Cocoa Touch 框架,他的降臨將重新定義軟件開發(fā)。

Swift 將現(xiàn)代編程語(yǔ)言的精華和蘋果工程師文化的智慧結(jié)合了起來(lái)。編譯器對(duì)性能進(jìn)行了優(yōu)化,編程語(yǔ)言對(duì)開發(fā)進(jìn)行了優(yōu)化,兩者互不干擾,魚與熊掌兼得。Swift 既可以用于開發(fā)“hello, world”這樣的小程序,也可以用于開發(fā)一套完整的操作系統(tǒng)。所有的這些特性讓 Swift 對(duì)于開發(fā)者和蘋果來(lái)說(shuō)都是一項(xiàng)值得的投資。

(2)我對(duì)Swift的第一印象

Swift對(duì)于以前的我是一項(xiàng)完全陌生的編程語(yǔ)言,但是通過(guò)兩周時(shí)間的接觸,我覺得它對(duì)于編程新手來(lái)說(shuō)是相當(dāng)友好的。它是一種工業(yè)級(jí)品質(zhì)的系統(tǒng)編程語(yǔ)言,但是卻和腳本語(yǔ)言一樣,寫起代碼來(lái)輕松愉快。在編寫代碼過(guò)程中,最大的感覺就是少了很多繁瑣的內(nèi)容,譬如,如果輸出一句“Hello, word!”,在Swift中只用一個(gè)語(yǔ)句就可以輸出。

print("Hello,world!")

2.?標(biāo)示符的命名規(guī)則

1.?字母、數(shù)字、下劃線組成,數(shù)字不能開頭;
??2.?對(duì)大小寫敏感(即區(qū)分大小寫);
??3.?不能使用關(guān)鍵字做表示符;
??4.?駝峰標(biāo)識(shí):第一個(gè)單詞全小寫,以后每個(gè)單詞的首字母大寫。

小知識(shí)點(diǎn)歸納

(1)?輸出Double類值的精確度(保留兩位小數(shù)):

print("周長(zhǎng):%.2f" 2 * M_PI * r)

(2)?字符串插值:

print("a =",terminator: "")
let a = inputDouble()
print("b =",terminator: "")
let b = inputDouble()
print("\(a) + \(b) = \(a + b)")
print("\(a) - \(b) = \(a - b)")
print("\(a) * \(b) = \(a * b)")
print("\(a) / \(b) = \(a / b)")

(3)?Swift中加減乘除運(yùn)算的左右兩邊類型必須一致。

(4)?元組(tuple):用一個(gè)變量或一個(gè)常量保存多項(xiàng)數(shù)據(jù)信息的類型。

let stu: (id: Int,name:String, gender:Bool, age:Int) = (1001, "王大錘", true, 23)

(5)用元組交換兩個(gè)變量的值:

print(x)
print(y)
(x, y) = (y, x)
print(x,y)

3.?循環(huán)體

1.repeat-while循環(huán):至少執(zhí)行一次

let answer = Int(arc4random_uniform(100)) + 1
var thyAnswer:Int
var counter = 0
repeat {
    counter += 1
    print("請(qǐng)輸入你猜的數(shù)字:",terminator:"")
    thyAnswer = inputInt()
    if thyAnswer > answer {
        print("小一點(diǎn)")
    }
    else if thyAnswer < answer {
        print("大一點(diǎn)")
    }
    else {
        print("恭喜你猜對(duì)了!你總共猜了\(counter)次")
    }
}while thyAnswer != answer

if counter > 7 {
    print("你的智商改充值了")
}

說(shuō)明:這是一個(gè)猜數(shù)字游戲的循環(huán)應(yīng)用,游戲規(guī)則是在1~100之間猜一個(gè)數(shù)字,直到猜中為止,這里面利用了repeat-while循環(huán)。

2.while循環(huán):有可能一次都不執(zhí)行

func isPrime(n: Int) -> Bool {
    var i = 2
    while i <= Int(sqrt(Double(n))) {
        if n % i == 0 {
            return false
        }
        i += 1
    }
    //如果上面的循環(huán)沒(méi)有返回false就說(shuō)明在2到n開根號(hào)之間沒(méi)有n的因子 因此返回true表示n是素?cái)?shù)
    return true
}
for n in 1...100 {
    if isPrime(n) {
        print(n)
    }
}

注:打印1-100之間所有的素?cái)?shù)!

3.for循環(huán)

print("num =",terminator:"")
let num = inputInt()

for i in 2..<num {
    if num % i == 0 {
        print("不是素?cái)?shù)")
    }
    else {
        print("是素?cái)?shù)")
    }
    break
}

注:輸入一個(gè)正整數(shù),判斷是不是素?cái)?shù)(質(zhì)數(shù))

4. ?數(shù)組

(1)創(chuàng)建數(shù)組

var array1 = [Int]()
var array2: [Int] = []
var array3 = [99, 12, 34, 456, 7]
var array4 = [Int](count: 100, repeatedValue: 1)
var array5 = [String]()
var array6: [String] = []
var array7 = ["apple", "grape", "banana", "apple", "orange"]
var array8 = [String](count: 100, repeatedValue: "")

(2)獲取數(shù)組的元素的個(gè)數(shù)

print(array1.count)
print(array2.count)
print(array3.count)
print(array4.count)

(3)對(duì)數(shù)組元素進(jìn)行遍歷

for i in 0..<array7.count {
    //[]是對(duì)數(shù)組進(jìn)行下標(biāo)運(yùn)算(取出指定位置的元素)
    print(array7[i])
    }

(4)數(shù)組中添加元素

array5.append("strawberry")
array5.append("pear")                  //追加 (在后面添加)
array5.insert("waxberry", atIndex: 0) // 插入(在指定位置插入)
array5.insert("watermelon", atIndex: 2)
array5.insert("lemon", atIndex: array5.count)
print(array5)

(5)數(shù)組中刪除元素

array5.removeAtIndex(2) //刪除指定位置的元素
print(array5)
array5.removeFirst()     //刪除第一個(gè)元素
print(array5)
array5.removeAll()       //刪除全部元素
print(array5)

(6)數(shù)組的復(fù)制

let array9 = array7       //全部復(fù)制
array7[0] = "pitaya"
print(array7)
print(array9)
var array10 = array7[1...3] //復(fù)制指定區(qū)域的元素
print(array10)

(7)數(shù)組的加法

let array11 = array7 + array9
print(array11)

說(shuō)明:必須是同種類型的才能想加。

5.? 數(shù)組的排序

(1)Swift中自帶的排序

var array = [29, 98, 35, 12, 47, 66, 53, 79]
let newArray = array.sort(>)   //降序: >
print(array)
print(newArray)

array.sortInPlace()
print(array)

var str = ["a", "j", "u", "i", "h", "d"]
let newstr = str.sort()
print(newstr)

str.sortInPlace(>)
print(str)

說(shuō)明:Swift中自帶的排序默認(rèn)為升序,要想打印出降序就將參數(shù)設(shè)為“>”。Swift中不僅可以對(duì)數(shù)值類型的進(jìn)行排序,也可以對(duì)非數(shù)值類型進(jìn)行排序。

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

var array = [29, 98, 35, 12, 47, 66, 53, 79]
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)

說(shuō)明:簡(jiǎn)單選擇排序———每次從剩下的元素中找最小的元素放到對(duì)應(yīng)的位置。
??我的總結(jié):

不管是哪種程序,重要的是要理清楚其中的思路及思想,在簡(jiǎn)單排序中,先創(chuàng)建一個(gè)整數(shù)類型的數(shù)組,當(dāng)然,首先定義變量或常量,在這里我們先定義一個(gè)變量 minIndex并賦予初值i,是表示我們第一個(gè)數(shù)為最小值,然后利用循環(huán)進(jìn)行兩兩比較,如果后邊的數(shù)array[j]小于前面的array[minIndex],則將array[j]的值賦予array[minIndex],如果后邊的數(shù)array[j]大于前面的array[minIndex],繼續(xù)和后面的比較,直到最后為止。

(3)冒泡排序

var array = [29, 98, 35, 12, 47, 66, 53, 79]
for i in 0..<array.count - 1 {
    var swapped = false     //表示當(dāng)前一輪沒(méi)有發(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
        }
    }
    if swapped == false {
        break           //如果在一次循環(huán)中沒(méi)有發(fā)生交換,立即終止。
    }
}
print(array)

說(shuō)明:冒泡排序———兩兩比較,前面的元素比后面的元素大就交換位置。

我的總結(jié):

在冒泡排序中也是用了for循環(huán)的嵌套,外面的for循環(huán)是對(duì)數(shù)組的排序,里面的for循環(huán)是對(duì)數(shù)組內(nèi)的兩兩之間進(jìn)行比較的循環(huán),冒泡排序是兩兩比較后將大的后移,第一輪找到最大值并放到數(shù)組的最后的位置。如果在其中的一輪沒(méi)有發(fā)生交換,添加了判斷語(yǔ)句,就要執(zhí)行該語(yǔ)句立即終止循環(huán),因?yàn)槟菚r(shí)已經(jīng)排好序了,不需要在浪費(fèi)時(shí)間!

6. 一些用例的總結(jié)

(1)Craps賭博游戲

游戲規(guī)則:
第一次搖出7點(diǎn)和11點(diǎn),玩家勝!
???搖出2,3,12點(diǎn),莊家勝。
???其余的點(diǎn)繼續(xù)
第二次:搖出7點(diǎn),莊家勝
???與第一次搖出的點(diǎn)一致,玩家勝
???其余的點(diǎn)繼續(xù)。

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)了?。?!")

解釋與說(shuō)明:
??變量與常量的定義不再說(shuō)明,這里產(chǎn)生隨機(jī)數(shù)用了函數(shù)的調(diào)用,
需要注意的是能用常量就不用變量,變量或常量定義的范圍越小越好。

(2)百錢百雞

要求:
??顧名思義,就是用100元錢買一百只雞,
??公雞5元一只,母雞3元一只,小雞一元三只。

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)")
        }
    }
}

說(shuō)明:這里應(yīng)用了窮舉法。
???窮舉法(窮舉所有的可能性直到找到正確答案)

(3)輸入兩個(gè)數(shù),輸出最大公約數(shù)和最小公倍數(shù)

print("第一個(gè)數(shù):",terminator:"")
let num1 = inputInt()
print("第二個(gè)數(shù):",terminator:"")
let num2 = inputInt()
var j = min(num1, num2) 
//var j = num1 < num2 ? num1 : num2
while j >= 1 {
    if num1 % j == 0 && num2 % j == 0{
        print("最大公約數(shù)為:\(j)")
        print("最小公倍數(shù):\(num1 * num2 / j)")
        break
    }
    j -= 1
}

4.學(xué)生成績(jī)統(tǒng)計(jì)

var namesArray = ["關(guān)羽","張飛","趙云","馬超","黃忠"]
var scoresArray = [Double](count: namesArray.count, repeatedValue: 0.0)

for (i,name) in namesArray.enumerate() {
    print("請(qǐng)輸入\(name)的成績(jī):", terminator: "")
    scoresArray[i] = inputDouble()
}

var sum = scoresArray[0]
var maxIndex = 0
var max = scoresArray[0]
var minIndex = 0
var min = scoresArray[0]
for (index,score) in scoresArray[1..<scoresArray.count].enumerate(){
    sum += score
    if score > max {
        max = score
        maxIndex = index + 1
    }
    else if score < min {
        min = score
        minIndex = index + 1
    }
}
print("平均分:\(sum / Double(scoresArray.count))")
print("\(namesArray[maxIndex])得到了最高分:\(max)")
print("\(namesArray[minIndex])得到了最低分:\(min)")

關(guān)于編寫好的代碼的感想

1.勤加練習(xí),要抓住每一次鍛煉的機(jī)會(huì)!
??2.勤加研究,對(duì)于代碼的每一個(gè)細(xì)節(jié)、思路都要研究透徹!
??3.平時(shí)多玩些智力題,邏輯推理題,寫代碼其實(shí)很多時(shí)候都是在玩邏輯推理,如果怎樣,否則怎樣,類似于這種選擇問(wèn)題!
??4.交流可以碰撞出火花,通過(guò)交流你會(huì)發(fā)現(xiàn)原來(lái)有些問(wèn)題可以這樣思考,而不是那樣思考!
??5.編程無(wú)處不在,處處皆編程,要真正喜歡上它,別覺得它是負(fù)擔(dān)和累贅!

** 第一次編寫這種文檔,看完后打賞一下哦!**
謝謝?。?!

最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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