作者:fengsh998
原文地址:http://blog.csdn.net/fengsh998/article/details/28258805
轉載請注明出處
如果覺得文章對你有所幫助,請通過留言或關注微信公眾帳號 fengsh998 來支持我,謝謝!
3號,端午剛過,回到公司第一個早上的兩小時便貢獻給了apple的ios 8 發布會,在看完后,感覺操作系統越來越離我們的生活更近了,更多的應用支持了人們的日常生活,健康,娛樂,旅游等領域,相信以后的生活也更加人工智能化,在發布會的最后,提到了swift的全新開發語言,據發布會上的介紹,更新安全,快捷,編碼高效。因此也對此進行了第一階段的初探與學習。
語言語法筆記:
1.常量和變量的定義。
常量使用let 進行約束, 變量使用var來約束,相信大家對var并不陌生,如早期的VB, pascal,js等都會有這樣的定義。但根據書中介紹,swift對常量,和變量的約束,編譯更加精確,有時候用戶可以不需要聲明某個常量是什么類型,像通常 聲明一個變量 int ?b = 0; 而 在swift中使用var b=0 即可,swift可根據初始化的值進行判斷是變量是什么類型,如果var 中沒有指定足夠的信息(當然是機算判斷變量類型的信息時,)可以使用分號進行加以說明,如書中的例子:
let implicitInteger = 70 ? ? ? ? ? ? //會自動識別為integer let implicitDouble = 70.0 let explicitDouble: Double = 70 ? ?//加上類型說明
變量的聲明與使用
var myVariable = 42 myVariable = 50 var explicitVariable:Double = 60
還有一點有意思是變量或常量的命名名稱,幾呼支持各種字符,包知unicode字符。
[cpp] ?view plaincopy
let?constvalue?=?70?;let?我愛你中國?=? "我要寫中國的操作系統" ?;println(constvalue)?;println(我愛你中國);??
上面代碼寫在一行時,需要用分隔號分開,如果不使用分號,可以使用換行符:
[cpp] ?view plaincopy
let?constvalue?=?70?? let?我愛你中國?=?"我要寫中國的操作系統" ?? println(constvalue)?? println(我愛你中國)??
運行后輸出:
[html] ?view plaincopy
70?? 我要寫中國的操作系統??
2.字符串串接及類型轉換
大家可能用OC都有一個想罵人的串接問題,如 在nsstring *a = "hello" 串接 " world",常常使用stringbyappendstring ,或使用stringWithFormat:"%@,%@" 來串接,有沒有?而不能使用"+"操作符。真難過,實在難過,特別是對于C/C++,PASCAL,JAVA 甚至更多高級語言都是支持“+”號操作符。唯有OC特別,搞得我一個同事說,想學習一下IOS,但語言太另類了,其實啥語言都大差不差,習慣就好。現在好了,swift來了,他也支持“+”號操作符了。如:
“let label = "The width is " let width = 94 let widthLabel = label + String(width)” 同時大家也可能發現了,width是整型,在這里被顯式的強制類型轉換為字符型,這里有個疑問,就是 如果沒有進行強制類型轉換,這let widthLabel = label + ?width這樣是否可以編譯過呢?編譯器會不會隱式的進行轉換呢,我也好期待,因為沒有操作環境,只是在看swift官方學習文檔中的,因此留在這里,后續有環境進行驗證一下。
接下來說說這個類型轉換,咋看又像在抄pascal 或java 的語法, c/c++ 的風格的都是(類型)變量,如(char *) var ,(double) var,而不會寫成double(var),oc的寫法,與c/C++的很像。沒太搞明白為毛,即整合c/c++的,又特地搞個風格別致的,當然,什么都不要緊,習慣就好。對吧,大伙說。
不過swift似呼也嗅到了什么,也提提供了另一種參變量使用"\() " 操作符,其中括號中的還支持表達式操作。至于反斜扛操作嘛,就有點像大家在C/C++ ?中的換行串接時,在行尾加上的\的含議差不多。看一下官方給出的例子:
“let apples = 3 let oranges = 5 let appleSummary = "I have?\(apples) ?apples." let fruitSummary = "I have?\(apples + oranges) ?pieces of fruit.” 可能用文字表達不出\()的意思,其實就是參數變量 把上面四句翻譯為oc 則為? NSInteger apples = 3;
NSInteger oranges = 5;
NSString *appleSummary = [NSString stringWithFormat:@"I have %d apples",apples];
經試驗:
[cpp] ?view plaincopy
let?constvalue?=?70?? let?我愛你中國?=?"我要寫中國的操作系統" ?? ?? let?ok?=?String(constvalue)+我愛你中國?? let?okgood?=?"字符串串接\(我愛你中國)" ?? println(okgood)??
輸出為:
字符串串接我要寫中國的操作系統
數據類型別名:
oc /c/c++都使用typedef 來約束新的類型別名
而swift 則使用typealias
typealias AudioSample = UInt16
字符串常量可以包括下面這些特殊字符: 空字符\0,反斜杠\,制表符\t,換行符\n,回車符\r,雙引號\”和單引號\’ 單字節Unicode字符,\xnn,其中nn是兩個十六進制數 雙字節Unicode字符,\unnnn,其中nnnn是四個十六進制數 四字節Unicode字符,\Unnnnnnnn,其中nnnnnnnn是八個十六進制數
[cpp] ?view plaincopy
let?wiseWords?=? "\"Imagination?is?more?important?than?knowledge\"?-?Einstein" ?? ?? let?dollarSign?=?"\x24" ? ?? let?blackHeart?=?"\u2665" ? ?? let?sparklingHeart?=?"\U0001F496" ? ??
初始化一個空字串
[cpp] ?view plaincopy
var?emptyString?=? "" ? ?? var?anotherEmptyString?=?String()???
同時可以使用isEmpty來判斷字符串是否為空,這點真的很像pascal,delphi就是這樣檢測的。
[cpp] ?view plaincopy
if ?emptyString.isEmpty?{?? println("Nothing?to?see?here" )?? }??
在swift中字符串不是指針,而是實際的值,因此,在Swift中,一個String類型就是一個實際的值,當定義一個新的String,并且將之前的String值拷貝過來的時候,是實際創建了一個相等的新值,而不是僅僅像指針那樣指向過去。同樣在函數傳遞參數的時候,也是傳遞的實際值,并且創建了一個新的字符串,
后續的操作都不會改變原有的String字符串
。
單個字符的聲明,像c/c++中使用 char ,而swift中則使用:
[cpp] ?view plaincopy
let?yenSign:?Character?=? "¥" ??
通過for-in循環,可以遍歷字符串中的每一個字符
[cpp] ?view plaincopy
for ?character?in? "Dog!" ?{?? println(character)?? }??
字符串長度的統計,可以使用全局函數countElements可以計算一個字符串中字符的數量,這點與其它語言length好像有點不同。
[cpp] ?view plaincopy
let?unusualMenagerie?=? "Koala?,?Snail?,?Penguin?,?Dromedary?" ?? println("unusualMenagerie?has?\(countElements(unusualMenagerie))?characters" )?? ??
字符串與單個字符,可以使用+,+=操作將字符串和字符串接在一起。這點與其它語言稍先進一點。
字符串的比較使用 ==
[cpp] ?view plaincopy
let?quotation?=? "We're?a?lot?alike,?you?and?I." ?? let?sameQuotation?=?"We're?a?lot?alike,?you?and?I." ?? if ?quotation?==?sameQuotation?{?? println("These?two?strings?are?considered?equal" )?? }?? ?? ??
swift還保留了oc中的前后綴函數hasPrefix和hasSuffix
大小寫字符串使用uppercaseString 和 lowercaseString
unicode :
Swift 支持多種不同的方式取得Unicode字符串. 你可以使用for-in語句遍歷字符串,來獲得每一個字符的Unicode編碼值。這個過程已經在字符(Working with Characters)描述過了。 或者,下面三個描述中使用合適的一個來獲得一個字符串的值 UTF-8字符編碼單元集合使用String類型的utf-8屬性 UTF-16字符編碼單元集合使用String類型的utf-16屬性 21位Unicode標量集合使用String類型的unicodeScalars屬性
如例子:
[cpp] ?view plaincopy
let?testUncode?=? "Dog!狗" ?? for ?codeUnit?in?testUncode.utf8?{?? ????print("\(codeUnit)?" )?? }?? print("\n" )?? ?? ?? for ?codeUnit?in?testUncode.utf16?{?? ????print("\(codeUnit)?" )?? }?? print("\n" )?? ?? ?? for ?scalar?in?testUncode.unicodeScalars?{?? ????print("\(scalar.value)?" )?? }?? print("\n" )?? ??
在utf-8中,中文的"狗"占三個字節,而在utf-16 及標量(utf-32)中正好可以一個字節就裝得下。
3.數組,字典
在swift的書中說,數組和字典都使用“[]”中括符,并可以通過索引或KEY /VALUE的方式存儲。見官方例子:
“var shoppingList = ["catfish", "water", "tulips", "blue paint"] ? ? //聲明一個四元素的數組變量 shoppingList[1] = "bottle of water" //重新將元素2的進行賦值 ? var occupations = [ ? ? "Malcolm": "Captain", ? ? "Kaylee": "Mechanic", ] occupations["Jayne"] = "Public Relations” ? ?//動太的添加一個jayne的key值為Public Relations
這個k/V的數組是否長的有點像JOSN啊。反正我看像,還可以動太的添加哦, 創建一個空的數組如: let ? emptyArray = String[]() //又是中括號又是圓括符的,看得真讓人眼花。不過swift中說了,如果不需要指字類型,則數組可以直接使用"[ ]"
進行。如: shoppingList = [] ? ,字典則使用 “ [ :]” 來設為空字典。
另外字典增加了一個定議模式,有點像C++中的vector 或map之類的,可以指字 k/v的類型吧。見例:
“let emptyDictionary = Dictionary<String, Float>()” 整體感覺上還是比較像C++吧。
[cpp] ?view plaincopy
?? ?? var?threeDoubles?=?Double[](count:?3,?repeatedValue:?0.0)?? println(threeDoubles)?? ?? ?? var?anotherThreeDoubles?=?Array(count:?3,?repeatedValue:?2.5)?? println(anotherThreeDoubles)?? ?? ?? var?computerList:?String[]?=?["lenovo" ,? "dell" ]?? ?? ?? if ?!computerList.isEmpty? ?? {?? ?????? ????println("數組共有?\(computerList.count)?元素." )?? ????println("元素分別為?\(computerList.description)" )? ?? }?? ?? ?? computerList?=?[]?? println("空數組?\(computerList)" )?? ?? ?? computerList.append("sony" )?? println("追加后為:\(computerList)" )??????????? ?? computerList?+=?"acer" ?? println("追加后為:\(computerList.description)" )?? ?? ?? computerList?+=?["HP" ,? "samsung" ,? "Apple" ]?? println("追加數組后為:\(computerList)" )?? var?items?=?["Haier" , "東之" ]?? computerList?+=?items?? println("追加數組后為:\(computerList)" )?? ?? ?? println("你訪問索引3的元素\(computerList[3])" )?? ?? println("修改前為:\(computerList[2])" )?? computerList[2]="SONY" ?? println("修改后為:\(computerList[2])" )?? ?? ?? ?? ?? computerList[4...6]?=?["惠普" ,? "三星" , "a" , "b" , "c" ] ?? println("修改后為:\(computerList)" )?? ?? ?? computerList.insert("computer" ,?atIndex:?0)?? println("插入后為:\(computerList)" )?? ?? ?? let?del?=?computerList.removeAtIndex(0)?? println("刪除的元素為:\(del)" )?? ?? ?? let?dellast?=?computerList.removeLast()?? println("最后的元素為:\(dellast)" )?? ?? ?? for ?item?in?computerList?? {?? ????println(item)?? }?? ?? ?? ?? for ?(index,?value)?in?enumerate(computerList)?? {?? ????println("Item?\(index?+?1):?\(value)" )?? }??
字典的使用
[cpp] ?view plaincopy
?? ?????????? ?????????? ????????var?airport?:Dictionary<String,?String>?=?["TYO" :? "Tokyo" ,? "DUB" :? "Dublin" ]?? ????????var?airports?=?["TYO" :? "Tokyo" ,? "DUB" :? "Dublin" ]?? ?????????? ?????????? ????????println("字典包函元素有?\(airports.count)?" )?? ?????????? ?????????? ????????airports["LHR" ]?=? "London" ?? ????????println("添加元素后\(airports)" )?? ?????????? ?????????? ????????airports["LHR" ]?=? "London?Heathrow" ?? ????????println("修改元素后\(airports)" )?? ?????????? ????????? ? ? ? ? ? ?? ????????if ?let?oldValue?=?airports.updateValue( "Dublin?International" ,?forKey:? "DUB" )?? ????????{?? ????????????println("The?old?value?for?DUB?was?\(oldValue)." )?? ????????????println("最新值\(airports)" )?? ????????}?? ?????????? ?????????? ????????if ?let?airportName?=?airports[ "DUB" ]?? ????????{?? ????????????println("The?name?of?the?airport?is?\(airportName)." )?? ????????}?? ????????else ?? ????????{?? ????????????println("That?airport?is?not?in?the?airports?dictionary." )?? ????????}?? ?????????? ?????????? ????????airports["APL" ]?=? "Apple?International" ?? ????????println("當前字典:\(airports)" )?? ????????airports["APL" ]?=?nil?? ????????println("移除后字典:\(airports)" )?? ?????????? ?????????? ????????if ?let?removedValue?=?airports.removeValueForKey( "DUB" )?? ????????{?? ????????????println("The?removed?airport's?name?is?\(removedValue)." )?? ????????}?? ????????else ?? ????????{?? ????????????println("The?airports?dictionary?does?not?contain?a?value?for?DUB." )?? ????????}?? ?????????? ?????????? ????????for ?(airportCode,?airportName)?in?airports?? ????????{?? ????????????println("\(airportCode):?\(airportName)" )?? ????????}?? ?????????? ?????????? ????????for ?airportCode?in?airports.keys?? ????????{?? ????????????println("Airport?code:?\(airportCode)" )?? ????????}?? ?? ?????????? ????????for ?airportName?in?airports.values?? ????????{?? ????????????println("Airport?name:?\(airportName)" )?? ????????}?? ?????????? ?????????? ????????let?airportCodes?=?Array(airports.keys)?? ????????println("所有keys?為:\(airportCodes)" )?? ?? ?????????? ????????let?airportNames?=?Array(airports.values)?? ????????println("所有values?為:\(airportNames)" )??
4.枚舉類型
枚舉在swift中可胃得到了很高的提升。不單單只簡單的支持Int數據類型,還擴展了支持其它數據類型,一起來探究一下吧
基本語法:
[cpp] ?view plaincopy
enum ?CompassPoint?{?? ????case ?North?? ????case ?South?? ????case ?East?? ????case ?West?? }??
每個case 為一個成員,但多個成員也可以寫在一個case里,用逗號分隔
[cpp] ?view plaincopy
enum ?Planet?{?? ????case ?Mercury,?Venus,?Earth,?Mars,?Jupiter,?Saturn,?Uranus,?Neptune?? }??
聲明及使用
[cpp] ?view plaincopy
?? var?dicection?:?CompassPoint?? ?? dicection?=?.East?? ?? var?directionToHead?=?CompassPoint.West?? ?? directionToHead?=?.South??
與 switch配合使用
[cpp] ?view plaincopy
????????var?directionToHead?=?CompassPoint.West?? ?????????? ????????switch ?directionToHead?{?? ????????case ?.North:?? ????????????println("Lots?of?planets?have?a?north" )?? ????????case ?.South:?? ????????????println("Watch?out?for?penguins" )?? ????????case ?.East:?? ????????????println("Where?the?sun?rises" )?? ????????case ?.West:?? ????????????println("Where?the?skies?are?blue" )?? ?? ?? ????????}??
枚舉的關聯值支持
Swift的枚舉類型可以由一些數據類型相關的組成,如果需要的話,這些數據類型可以是各不相同的。枚舉的這種特性跟其它語言中的奇異集合
如:
[cpp] ?view plaincopy
enum ?Barcode?{?? ????case ?UPCA(Int,?Int,?Int)?? ????case ?QRCode(String)?? }??
然后可以使用任何一種類型來創建如:
[cpp] ?view plaincopy
var?productBarcode?=?Barcode.UPCA(8,?85909_51226,?3)??
此示例創建一個名為productBarcode新的變量,并與相關聯的元組值賦給它Barcode.UPCA的值(8,8590951226,3)。
也可以使用:
[cpp] ?view plaincopy
productBarcode?=?.QRCode( "ABCDEFGHIJKLMNOP" )??
不同的條碼類型像以前一樣可以使用一個switch語句來檢查,但是這一次相關的值可以被提取作為switch語句的一部分。您提取每個相關值作為常數(let前綴)或變量(var前綴)不同的情況下,在switch語句的case代碼內使用
[cpp] ?view plaincopy
switch ?productBarcode?{?? case ?.UPCA(let?numberSystem,?let?identifier,?let?check):?? ????println("UPC-A?with?value?of?\(numberSystem),?\(identifier),?\(check)." )?? case ?.QRCode(let?productCode):?? ????println("QR?code?with?value?of?\(productCode)." )?? }??
如果所有的枚舉成員的關聯值的提取為常數,或者當所有被提取為變量,為了簡潔起見,可以放置一個var,或let標注在成員名稱前
[cpp] ?view plaincopy
switch ?productBarcode?{?? case ?let?.UPCA(numberSystem,?identifier,?check):?? ????println("UPC-A?with?value?of?\(numberSystem),?\(identifier),?\(check)." )?? case ?let?.QRCode(productCode):?? ????println("QR?code?with?value?of?\(productCode)." )?? }??
別外也可以有給成員設置指定值:
[cpp] ?view plaincopy
enum ?ASCIIControlCharacter:?Character?{?? ????case ?Tab?=? "\t" ??????????????? ?? ????case ?LineFeed?=? "\n" ?? ????case ?CarriageReturn?=? "\r" ?? }??
[cpp] ?view plaincopy
enum ?ASCIIControlCharacter:?Int?{?? ????case ?Tab?=?10?? ????case ?LineFeed?=?20?? ????case ?CarriageReturn?=?30?? }??
同樣還可以使枚舉跟c/C++,java,pascal phyon等高級語言的效果一樣。只需要設置第一個值后,后面的值會類推。
[cpp] ?view plaincopy
enum ?Planet:?Int?{?? ????case ?Mercury?=?1,?Venus,?Earth,?Mars,?Jupiter,?Saturn,?Uranus,?Neptune?? }??
后面的成員會自增。
同時swift還提供了訪問枚舉成中中的原始值,使用toRaw()如:
[cpp] ?view plaincopy
let?earthsOrder?=?Planet.Earth.toRaw()?? ??
另外,還提供了一個檢查訪問,fromRaw()
[cpp] ?view plaincopy
let?possiblePlanet?=?Planet.fromRaw(7)?? ??
使用枚舉的fromRaw方法來試圖找到一個特定的原始值枚舉成員。這個例子識別Uranus的位置通過原始值為7:然而,并非所有可能的Int值都會找到一個匹配的星球。正因如此,該fromRaw方法返回一個可選的枚舉成員。在上面的例子中,是possiblePlanet類型Planet?或“可選的Planet”。
如果你試圖找到一個Planet為9的位置,通過fromRaw返回可選的Planet值將是無:因此在配合switch時可以這樣:
[cpp] ?view plaincopy
let?positionToFind?=?9?? if ?let?somePlanet?=?Planet.fromRaw(positionToFind)?{?? ????switch ?somePlanet?{?? ????case ?.Earth:?? ????????println("Mostly?harmless" )?? ????default :?? ????????println("Not?a?safe?place?for?humans" )?? ????}?? }?else ?{?? ????println("There?isn't?a?planet?at?position?\(positionToFind)" )?? }?? ??
5.條件表達式。
if/swicth?
“let individualScores = [75, 43, 103, 87, 12] var teamScore = 0 for score in individualScores { ? ??if score > 50 { ? ? ? ? teamScore += 3 ? ? } else { ? ? ? ? teamScore += 1 ? ? } }” teamScore
為什么都不加括號了?對于多個表達式,還是這樣長蛇陣么?
另外書中有這一段“In an if statement, the conditional must be a Boolean expression—this means that code such as if score { ... } is an error, not an implicit comparison to zero.” 個人理解是,如果在一個條件語句中,條件值必須是BOOL表達式的,因為非BOOL表達式不會隱式的與0進行比較,這點可能與傳統的if有點不同吧。
經驗證:多個條件也不需要用括號的。不過,如果你想要表達式正確,還是要按照運算優先級。
[cpp] ?view plaincopy
var?constvalueB?=?200?? let?constvalue?=?70?? if ?constvalueB?==?0?&&?constvalue?>?60?||?constvalue?!=?20?? {?? ????println("true" )?? }?? else ?? {?? ????println("false" )?? }??
別外像:
[cpp] ?view plaincopy
var?constvalueB?=?200?? let?constvalue?=?70?? if ?constvalueB??? {?? ????println("true" )?? }?? else ?? {?? ????println("false" )?? }??
對
[cpp] ?view plaincopy
constvalueB??
這樣的條件,在swift中已經通不過了,對條件判斷也更別嚴格了。?
再來看一下switch,這個總算有點點進步了,以前的switch大多只支持int或枚舉類型,現在swift中把switch語句的表達式判斷類型上進行了擴展。其次,每個case不再需要寫break;這點不錯。
“let vegetable = "red pepper" switch vegetable { case "celery": ? ? let vegetableComment = "Add some raisins and make ants on a log." case "cucumber", "watercress": ? ? let vegetableComment = "That would make a good tea sandwich." case let x where x.hasSuffix("pepper"): ? ? let vegetableComment = "Is it a spicy \(x)?" default: ? ? let vegetableComment = "Everything tastes good in soup." }” 哈哈,看到沒有,沒有break哦。。。冒似少了幾個B的代碼。
switch語句的case中可以匹配一個數值范圍
[cpp] ?view plaincopy
let?count?=?3_000_000_000_000?? let?countedThings?=?"stars?in?the?Milky?Way" ?? var?naturalCount:?String?? switch ?count?{?? case ?0:?? ????naturalCount?=?"no" ?? case ?1...3:?? ????naturalCount?=?"a?few" ?? case ?4...9:?? ????naturalCount?=?"several" ?? case ?10...99:?? ????naturalCount?=?"tens?of" ?? case ?100...999:?? ????naturalCount?=?"hundreds?of" ?? case ?1000...999_999:?? ????naturalCount?=?"thousands?of" ?? default :?? ????naturalCount?=?"millions?and?millions?of" ?? }?? println("There?are?\(naturalCount)?\(countedThings)." )??
case中還可以直接測試元組是否符合相應的條件,_可以匹配任意值
[cpp] ?view plaincopy
let?somePoint?=?(1,?1)?? switch ?somePoint?{?? case ?(0,?0):?? ????println("(0,?0)?is?at?the?origin" )?? case ?(_,?0):?? ????println("(\(somePoint.0),?0)?is?on?the?x-axis" )?? case ?(0,?_):?? ????println("(0,?\(somePoint.1))?is?on?the?y-axis" )?? case ?(-2...2,?-2...2):?? ????println("(\(somePoint.0),?\(somePoint.1))?is?inside?the?box" )?? default :?? ????println("(\(somePoint.0),?\(somePoint.1))?is?outside?of?the?box" )?? }?? ??
在case匹配的同時,可以將switch語句中的值綁定給一個特定的常量或者變量,以便在case的語句中使用。比如
[cpp] ?view plaincopy
let?anotherPoint?=?(2,?0)?? switch ?anotherPoint?{?? case ?(let?x,?0):?? ????println("on?the?x-axis?with?an?x?value?of?\(x)" )?? case ?(0,?let?y):?? ????println("on?the?y-axis?with?a?y?value?of?\(y)" )?? case ?let?(x,?y):?? ????println("somewhere?else?at?(\(x),?\(y))" )?? }?? ??
思考:如果沒有defalut:會是什么樣的?有環境驗證一下。
驗證后有幾個有意思的地方:
一,對成員具有完整性檢測:如:
[cpp] ?view plaincopy
enum ?CompassPoint?:Int?{?? ????case ?North?? ????case ?South?? ????case ?East?? ????case ?West?? }?? ?? var?directionToHead?=?CompassPoint.West????? ?? switch ?directionToHead?{?? case ?.North:?? ????println("Lots?of?planets?have?a?north" )?? case ?.South:?? ????println("Watch?out?for?penguins" )?? case ?.East:?? ????println("Where?the?sun?rises" )?? }??
這里編譯期會報錯,提示未找到West。
可以通過以下兩種方式進行修正:
[cpp] ?view plaincopy
switch ?directionToHead?{?? case ?.North:?? ????println("Lots?of?planets?have?a?north" )?? case ?.South:?? ????println("Watch?out?for?penguins" )?? case ?.East:?? ????println("Where?the?sun?rises" )?? case ?.West:?? ????println("Where?the?west" );?? }??
[cpp] ?view plaincopy
switch ?directionToHead?{?? case ?.North:?? ????println("Lots?of?planets?have?a?north" )?? case ?.South:?? ????println("Watch?out?for?penguins" )?? case ?.East:?? ????println("Where?the?sun?rises" )?? default :?? ????println("Where?the?west" );?? }??
別外還遇到一個告警問題:
如果switch的條件聲明在同一個函數內,這時會提示Switch?condition evaluates to a constant 要去除這個,只需要將聲明的變量放在函數外就可以
var ?directionToHead :?CompassPoint ?= .West
6.循環
for - in,for, while, do-while
在for-in ?中使用k/v數組,
“let interestingNumbers = [ ? ? "Prime": [2, 3, 5, 7, 11, 13], ? ? "Fibonacci": [1, 1, 2, 3, 5, 8], ? ? "Square": [1, 4, 9, 16, 25], ] var largest = 0 for (kind, numbers) in interestingNumbers { ? ? for number in numbers { ? ? ? ? if number > largest { ? ? ? ? ? ? largest = number ? ? ? ? } ? ? } } largest” 這個讓我感慨的就是每個變量都沒有進行顯式的聲明類型。這也許就是swift所宣存的精確,高效的一個原因之一吧。
另外for 也像pascal一樣支持“..”范圍操作符。可能熟釋DELPHI的朋友一定很深的印象。像這樣的for
procedure foroperation
var?
? ? ?char c;
begin
? ? ?for (c in ['a'..'z']) do
? ? begin
? ? ? ?//do something.
? ? end;
end;
官網的例子:
“var firstForLoop = 0 for i in 0..3 { ? ? firstForLoop += i } firstForLoop ? var secondForLoop = 0 for var i = 0; i < 3; ++i { ? ? secondForLoop += 1 } secondForLoop” 兩個for 過程是一樣的,即i都是從0-3. 其實delphi 中還有low() to high()操作的,這個swift應該沒有吧,如果有的話,我想apple的工程師都應經歷了pascal的時代。
值得注意的是:swift中不僅有".." 也有"...",分別代表什么呢。兩個點,相當于小于如0..3 等價于 0<=i<3 而使用...則相等于 "<=" 如 ?0..3 等價于 0<=i<=3?
while / do while
“var n = 2 while n < 100 { ? ? n = n * 2 } n ? var m = 2 do { ? ? m = m * 2 } while m < 100 m” 7.函數的語法
“func greet(name: String, day: String ) ->?String ?{ ? ? return "Hello \(name), today is \(day)." } greet("Bob", "Tuesday")” 通過這個例子,可以看到使用func關鍵詞進行聲明,其次 輸入參數 使用“變量:類型”的型式,這還真像pascal,你還別說。最有特色的就是這個返回值,參過->符號指定返回的類型。這個也許是C++的地址函問符的一個使用方式吧,每個函數返回的其實都是一個地址塊。另外函數如果有多個返回(即傳出參數)怎么處理呢?如C/C++ 的使用“**”指針的指針 如 func(char ** outstring) ?但在 swift中則:
“func getGasPrices() -> (Double, Double, Double) { ? ? return (3.59, 3.69, 3.79) } getGasPrices()” 其次swift中的函數參數為數組時的寫法,也很特別:
“func sumOf(numbers: Int...) -> Int { ? ? var sum = 0 ? ? for number in numbers { ? ? ? ? sum += number ? ? } ? ? return sum } sumOf() sumOf(42, 597, 12)” 內連函數的支持
很多高級語方中都有內連函數,內連函數的使用也是很常見的一種,不僅使得代碼執行更加高效,同時也減少了內存碎片。
一起看一下swift的內連函數的寫法:
“func returnFifteen() -> Int { ? ? var y = 10 ? ??func add() { ? ? ? ? y += 5 ? ? } ? ? add() ? ? return y } returnFifteen()” 還有一個特另的:就是swift還提供了在函數中返回函數來看一下,寫法也比較另類:
“func makeIncrementer() -> (Int -> Int) { ? ??func addOne(number: Int) -> Int { ? ? ? ? return 1 + number ? ? } ? ? return addOne } var increment = makeIncrementer() ? ? //increment 可理解為addOne的函數指針 increment(7)” 把這段代碼解讀一下,首先紅色部分是一個函數,入參為整型,返回一個整型的值。 再來看最外層的函數makeIncrementer 沒有入參,有返回值,而返回值是使用"()"括起來。
int ->int ?這個表示返回的為一個函數地址,該函數有一個int型的輸入參數,同時還有一個int 型的返回值參數。這與c/c++的函數指很是有差別。
在swift中,函數也可以作為參數進行傳遞:(見紅色部分)
“func hasAnyMatches(list: Int[],?condition: Int -> Bool ) -> Bool { ? ? for item in list { ? ? ? ? if condition(item) { ? ? ? ? ? ? return true ? ? ? ? } ? ? } ? ? return false } func lessThanTen(number: Int) -> Bool { ? ? return number < 10 } var numbers = [20, 19, 7, 12] hasAnyMatches(numbers,?lessThanTen )” 最后還有三個沒有理解透,等有ios 8 的環境再驗證,好像是匿名函數的使用。
“numbers.map({ ? ? (number: Int) -> Int in ? ? let result = 3 * number ? ? return result ? ? })” “numbers.map({ number in 3 * number })” “sort([1, 5, 3, 12, 2]) { $0 > $1 }” 寫得有點粗,英文不怎么樣,邊看,邊理解,邊記錄的。
好吧,今天就先學到到這,希望這個對你有所幫助。別還不知道是否為大小寫敏感的,若是的話,還真有點蛋痛,看他的官方例子,某些關鍵詞一會大寫開頭,一會小寫開頭。。。。。。。下一個學習,將是swift的對象和類(即面向對象編程)
總結
以上是生活随笔 為你收集整理的初探swift语言的学习笔记一(基本数据类型) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。