我與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)和累贅!
** 第一次編寫這種文檔,看完后打賞一下哦!**
謝謝?。?!