日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初探swift语言的学习笔记一(基本数据类型)

發布時間:2024/9/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初探swift语言的学习笔记一(基本数据类型) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作者: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"??
  • //?"Imagination?is?more?important?than?knowledge"?-?Einstein??
  • let?dollarSign?=?"\x24"?//?$,?Unicode?scalar?U+0024??
  • let?blackHeart?=?"\u2665"?//??,?Unicode?scalar?U+2665??
  • let?sparklingHeart?=?"\U0001F496"?//?,?Unicode?scalar?U+1F496??

  • 初始化一個空字串

    [cpp]?view plaincopy
  • var?emptyString?=?""?//?empty?string?literal??
  • var?anotherEmptyString?=?String()?//?initializer?syntax??
  • 同時可以使用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")??
  • //?prints?"unusualMenagerie?has?40?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")??
  • }??
  • //?prints?"These?two?strings?are?considered?equal"??
  • //輸出”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")??
  • //?68?111?103?33?231?139?151??
  • ??
  • for?codeUnit?in?testUncode.utf16?{??
  • ????print("\(codeUnit)?")??
  • }??
  • print("\n")??
  • //?68?111?103?33?29399??
  • ??
  • for?scalar?in?testUncode.unicodeScalars?{??
  • ????print("\(scalar.value)?")??
  • }??
  • print("\n")??
  • //?68?111?103?33?29399??

  • 在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[]()?//創建一個空的數組??
  • var?computerList:?String[]?=?["lenovo",?"dell"]??
  • //var?computerList?=?["lenovo",?"dell"]?//與上等效??
  • ??
  • if?!computerList.isEmpty?//判斷是否為空數組??
  • {??
  • ????//數組長度??
  • ????println("數組共有?\(computerList.count)?元素.")??
  • ????println("元素分別為?\(computerList.description)")?//使用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])")??
  • ??
  • //通過閉包訪問一次修改多個值??
  • //注意[4..6]是半閉包即只包括改修4,5而不包括6??
  • //使用[4...6]是全閉包,可以修改4,5,6??
  • 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)??
  • }??
  • ??
  • //如果需要每一個元素的整形的索引值,使用enumerate函數代替會更方便??
  • //enumerate函數對于每一個元素都會返回一個包含元素的索引和值的元組??
  • for?(index,?value)?in?enumerate(computerList)??
  • {??
  • ????println("Item?\(index?+?1):?\(value)")??
  • }??

  • 字典的使用

    [cpp]?view plaincopy
  • //字典??
  • ????????//Dictionary<KeyType,ValueType>?唯一的限制就是KeyType必須是可哈希的(hashable)??
  • ????????//var?namesOfIntegers?=?Dictionary<Int,?String>()??//創建空字典??
  • ????????var?airport?:Dictionary<String,?String>?=?["TYO":?"Tokyo",?"DUB":?"Dublin"]??
  • ????????var?airports?=?["TYO":?"Tokyo",?"DUB":?"Dublin"]??
  • ??????????
  • ????????//字典元素??
  • ????????println("字典包函元素有?\(airports.count)?")??
  • ??????????
  • ????????//使用key添加?value??
  • ????????airports["LHR"]?=?"London"??
  • ????????println("添加元素后\(airports)")??
  • ??????????
  • ????????//使用key修改??
  • ????????airports["LHR"]?=?"London?Heathrow"??
  • ????????println("修改元素后\(airports)")??
  • ??????????
  • ????????/*updateValue(forKey:)?方法如果鍵不存在則會設置它的值,如果鍵存在則會更新它的值,?和下標不一樣是?
  • ????????updateValue(forKey:)?方法?如果更新時,會返回原來舊的值rThis?enables?you?to?可以使用這個來判斷是否發生了?
  • ?????????
  • ????????updateValue(forKey:)?方法返回一個和字典的值相同類型的可選值.?例如,?
  • ????????如果字典的值的類型時String,則會返回String??或者叫“可選String“,?
  • ????????這個可選值包含一個如果值發生更新的舊值和如果值不存在的nil值。?
  • ????????*/??
  • ????????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)")??
  • ??????????
  • ????????//也可以使用removeValueForKey?移除??
  • ????????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)")??
  • ????????}??
  • ??????????
  • ????????//遍歷key??
  • ????????for?airportCode?in?airports.keys??
  • ????????{??
  • ????????????println("Airport?code:?\(airportCode)")??
  • ????????}??
  • ??
  • ????????//遍歷value??
  • ????????for?airportName?in?airports.values??
  • ????????{??
  • ????????????println("Airport?name:?\(airportName)")??
  • ????????}??
  • ??????????
  • ????????//獲取所有key?轉為數組??
  • ????????let?airportCodes?=?Array(airports.keys)??
  • ????????println("所有keys?為:\(airportCodes)")??
  • ??
  • ????????//獲取所有value?轉為數組??
  • ????????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")??
  • //????????default:??//如果不需要各個都配置時,可以使用defult??
  • //????????????println("no?what");??
  • ????????}??
  • 枚舉的關聯值支持

    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"???????????????//這里設置值要與<span?style="font-family:?Arial,?Helvetica,?sans-serif;">Character?類型相對應</span>??
  • ????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()??
  • //?earthsOrder?is?3??
  • 另外,還提供了一個檢查訪問,fromRaw()
    [cpp]?view plaincopy
  • let?possiblePlanet?=?Planet.fromRaw(7)??
  • //?possiblePlanet?is?of?type?Planet??and?equals?Planet.Uranus??

  • 使用枚舉的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)")??
  • }??
  • //?prints?"There?isn't?a?planet?at?position?9"??

  • 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")??
  • }??
  • //?prints?"(1,?1)?is?inside?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))")??
  • }??
  • //?prints?"on?the?x-axis?with?an?x?value?of?2"??



  • 思考:如果沒有defalut:會是什么樣的?有環境驗證一下。

    驗證后有幾個有意思的地方:

    一,對成員具有完整性檢測:如:

    [cpp]?view plaincopy
  • enum?CompassPoint?:Int?{??
  • ????case?North??
  • ????case?South??
  • ????case?East??
  • ????case?West??
  • }??
  • ??
  • var?directionToHead?=?CompassPoint.West???//預先指定為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语言的学习笔记一(基本数据类型)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: v天堂在线观看 | 久久国产精品无码一级毛片 | 亚洲天堂视频在线 | 欧美一区二区三区久久精品 | 免费黄色高清视频 | 久久久精品麻豆 | 日韩黄色片免费看 | 国产原创在线播放 | 欧美日韩国内 | 亚洲国产日韩在线观看 | a级黄色一级片 | 在线无码va中文字幕无码 | 国产一区二区三区精品在线 | 色婷婷av一区二区三区之红樱桃 | 超碰首页| 亚洲欧美国产精品久久久久久久 | 国产精品情侣呻吟对白视频 | 日韩在线导航 | 活大器粗np高h一女多夫 | xxxwww18| 国产一区二区三区麻豆 | 日本欧美三级 | 久色视频 | 爱情岛亚洲首页论坛 | 91中文字日产乱幕4区 | 国产一区二区三区日韩 | 欧美一级淫片aaaaaa | 久久久久久中文字幕 | 手机看黄色 | 国产精品你懂得 | 欧美videossex极品 | 久久天天干 | 精品久久久久久久久久久久久久久久久 | av大帝在线 | 亚洲偷偷自拍 | 韩国视频一区二区三区 | 亚洲第一黄色网 | 污视频网站免费看 | 黄色一区二区三区 | 国产精品一区无码 | 亚洲精品一区二三区 | 亚洲成a人片在线www | 久久er99热精品一区二区 | 祥仔视觉av | 中文在线a√在线 | 中文字幕一区三区 | 成人动漫中文字幕 | 精品日本一区二区三区 | 国产特黄| 国模叶桐尿喷337p人体 | 日韩二区在线观看 | 黄色av日韩 | 精品交短篇合集 | 综合久久影院 | 色哟哟免费观看 | 成人无高清96免费 | 黑人精品一区二区三区 | 日韩在线激情视频 | 3p在线视频| 国产情侣第一页 | 岛国激情| 丰满护士巨好爽好大乳 | 99热在线免费观看 | 欧美a v在线播放 | 日本在线观看网站 | 欧美亚韩一区二区三区 | 超污巨黄的小短文 | 黄色一毛片 | 欧美精品一区二区三区四区五区 | 99久视频 | 涩涩成人网| 成人性生交大片免费看vrv66 | 免费福利小视频 | 欧美高清性xxxxhdvideosex | 色婷婷婷| 午夜两性网| 网站久久 | 亚洲精品专区 | 中文字幕一区二区三区日韩精品 | 免费看黄网址 | 51精产品一区一区三区 | 少妇高潮惨叫久久久久 | 在线一级片 | 精品国产伦一区二区三区免费 | 青青草免费在线观看 | 激情瑟瑟| 精品无码国产av一区二区三区 | 第四色男人天堂 | 欧美精品日韩在线 | 人人看人人模 | 91亚洲专区 | 黄床大片| 新天堂网 | 在线观看国产精品入口男同 | 玖玖爱在线精品视频 | 日本香蕉网| 欧美人禽杂交狂配 | 欧美激情一区二区三区蜜桃视频 | 日本在线观看视频网站 |