快來(lái)加入群【Swift】(群號(hào)302605932)
http://download.csdn.net/detail/qi_ruihua/7439851
基本概念
注:這一節(jié)的代碼源自
The Swift Programming Language 中的A Swift Tour。
Hello, world
類似于腳本語(yǔ)言,下面的代碼即是一個(gè)完整的Swift程序。
println("Hello,?world" )?
變量與常量
Swift使用var聲明變量,let聲明常量。
var ?myVariable?=?42?myVariable?=?50? let?myConstant?=?42?
類型推導(dǎo)
Swift支持類型推導(dǎo)(Type Inference),所以上面的代碼不需指定類型,如果需要指定類型:
let?explicitDouble?:?Double?=?70?
Swift不支持隱式類型轉(zhuǎn)換(Implicitly casting),所以下面的代碼需要顯式類型轉(zhuǎn)換(Explicitly casting):
let?label?=?"The?width?is?" ? let?width?=?94? let?width?=?label?+?String(width)?
字符串格式化
Swift使用\(item)的形式進(jìn)行字符串格式化:
let?apples?=?3? let?oranges?=?5? let?appleSummary?=?"I?have?\(apples)?apples." ? let?appleSummary?=?"I?have?\(apples?+?oranges)?pieces?of?fruit." ?
數(shù)組和字典
Swift使用[]操作符聲明數(shù)組(array)和字典(dictionary):
var ?shoppingList?=?["catfish" ,?"water" ,?"tulips" ,?"blue?paint" ]?shoppingList[1]?=?"bottle?of?water" ? ?? var ?occupations?=?[?????"Malcolm" :?"Captain" ,? ????"Kaylee" :?"Mechanic" ,? ]? occupations["Jayne" ]?=?"Public?Relations" ?
一般使用初始化器(initializer)語(yǔ)法創(chuàng)建空數(shù)組和空字典:
let?emptyArray?=?String[]()? let?emptyDictionary?=?Dictionary<String,?Float>()?
如果類型信息已知,則可以使用[]聲明空數(shù)組,使用[:]聲明空字典。
控制流
概覽
Swift的條件語(yǔ)句包含if和switch,循環(huán)語(yǔ)句包含for-in、for、while和do-while,循環(huán)/判斷條件不需要括號(hào),但循環(huán)/判斷體(body)必需括號(hào):
let?individualScores?=?[75,?43,?103,?87,?12]? var ?teamScore?=?0?for ?score?in ?individualScores?{?????if ?score?>?50?{? ????????teamScore?+=?3? ????}?else ?{? ????????teamScore?+=?1? ????}? }?
可空類型
結(jié)合if和let,可以方便的處理可空變量(nullable variable)。對(duì)于空值,需要在類型聲明后添加?顯式標(biāo)明該類型可空。
var ?optionalString:?String??=?"Hello" ?optionalString?==?nil? ?? var ?optionalName:?String??=?"John?Appleseed" ?var ?gretting?=?"Hello!" ?if ?let?name?=?optionalName?{?????gretting?=?"Hello,?\(name)" ? }?
靈活的switch
Swift中的switch支持各種各樣的比較操作:
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." ? }?
其它循環(huán)
for-in除了遍歷數(shù)組也可以用來(lái)遍歷字典:
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?
while循環(huán)和do-while循環(huán):
var ?n?=?2?while ?n?<?100?{?????n?=?n?*?2? }? n? ?? var ?m?=?2?do ?{?????m?=?m?*?2? }?while ?m?<?100? m?
Swift支持傳統(tǒng)的for循環(huán),此外也可以通過(guò)結(jié)合..(生成一個(gè)區(qū)間)和for-in實(shí)現(xiàn)同樣的邏輯。
var ?firstForLoop?=?0?for ?i?in ?0..3?{?????firstForLoop?+=?i? }? firstForLoop? ?? var ?secondForLoop?=?0?for ?var ?i?=?0;?i?<?3;?++i?{?????secondForLoop?+=?1? }? secondForLoop?
注意:Swift除了..還有...:..生成前閉后開(kāi)的區(qū)間,而...生成前閉后閉的區(qū)間。
函數(shù)和閉包
函數(shù)
Swift使用func關(guān)鍵字聲明函數(shù):
func?greet(name:?String,?day:?String)?->?String?{? ????return ?"Hello?\(name),?today?is?\(day)." ? }? greet("Bob" ,?"Tuesday" )?
通過(guò)元組(Tuple)返回多個(gè)值:
func?getGasPrices()?->?(Double,?Double,?Double)?{? ????return ?(3.59,?3.69,?3.79)? }? getGasPrices()?
支持帶有變長(zhǎng)參數(shù)的函數(shù):
func?sumOf(numbers:?Int...)?->?Int?{? ????var ?sum?=?0? ????for ?number?in ?numbers?{? ????????sum?+=?number? ????}? ????return ?sum? }? sumOf()? sumOf(42,?597,?12)?
函數(shù)也可以嵌套函數(shù):
func?returnFifteen()?->?Int?{? ????var ?y?=?10? ????func?add()?{? ????????y?+=?5? ????}? ????add()? ????return ?y? }? returnFifteen()?
作為頭等對(duì)象,函數(shù)既可以作為返回值,也可以作為參數(shù)傳遞:
func?makeIncrementer()?->?(Int?->?Int)?{? ????func?addOne(number:?Int)?->?Int?{? ????????return ?1?+?number? ????}? ????return ?addOne? }? var ?increment?=?makeIncrementer()?increment(7)?
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)?
閉包
本質(zhì)來(lái)說(shuō),函數(shù)是特殊的閉包,Swift中可以利用{}聲明匿名閉包:
numbers.map({? ????(number:?Int)?->?Int?in ? ????let?result?=?3?*?number? ????return ?result? ????})?
當(dāng)閉包的類型已知時(shí),可以使用下面的簡(jiǎn)化寫法:
numbers.map({?number?in ?3?*?number?})?
此外還可以通過(guò)參數(shù)的位置來(lái)使用參數(shù),當(dāng)函數(shù)最后一個(gè)參數(shù)是閉包時(shí),可以使用下面的語(yǔ)法:
sort([1,?5,?3,?12,?2])?{?$0?>?$1?}?
類和對(duì)象
創(chuàng)建和使用類
Swift使用class創(chuàng)建一個(gè)類,類可以包含字段和方法:
class ?Shape?{?????var ?numberOfSides?=?0? ????func?simpleDescription()?->?String?{? ????????return ?"A?shape?with?\(numberOfSides)?sides." ? ????}? }?
創(chuàng)建Shape類的實(shí)例,并調(diào)用其字段和方法。
var ?shape?=?Shape()?shape.numberOfSides?=?7? var ?shapeDescription?=?shape.simpleDescription()?
通過(guò)init構(gòu)建對(duì)象,既可以使用self顯式引用成員字段(name),也可以隱式引用(numberOfSides)。
class ?NamedShape?{?????var ?numberOfSides:?Int?=?0? ????var ?name:?String? ?? ????init(name:?String)?{? ????????self.name?=?name? ????}? ?? ????func?simpleDescription()?->?String?{? ????????return ?"A?shape?with?\(numberOfSides)?sides." ? ????}? }?
使用deinit進(jìn)行清理工作。
繼承和多態(tài)
Swift支持繼承和多態(tài)(override父類方法):
class ?Square:?NamedShape?{?????var ?sideLength:?Double? ?? ????init(sideLength:?Double,?name:?String)?{? ????????self.sideLength?=?sideLength? ????????super .init(name:?name)? ????????numberOfSides?=?4? ????}? ?? ????func?area()?->?Double?{? ????????return ?sideLength?*?sideLength? ????}? ?? ????override?func?simpleDescription()?->?String?{? ????????return ?"A?square?with?sides?of?length?\(sideLength)." ? ????}? }? let?test?=?Square(sideLength:?5.2,?name:?"my?test?square" )? test.area()? test.simpleDescription()?
注意:如果這里的simpleDescription方法沒(méi)有被標(biāo)識(shí)為override,則會(huì)引發(fā)編譯錯(cuò)誤。
屬性
為了簡(jiǎn)化代碼,Swift引入了屬性(property),見(jiàn)下面的perimeter字段:
class ?EquilateralTriangle:?NamedShape?{?????var ?sideLength:?Double?=?0.0? ? ????init(sideLength:?Double,?name:?String)?{? ????????self.sideLength?=?sideLength? ????????super .init(name:?name)? ????????numberOfSides?=?3? ????}? ? ????var ?perimeter:?Double?{? ????get?{? ????????return ?3.0?*?sideLength? ????}? ????set?{? ????????sideLength?=?newValue?/?3.0? ????}? ????}? ? ????override?func?simpleDescription()?->?String?{? ????????return ?"An?equilateral?triagle?with?sides?of?length?\(sideLength)." ? ????}? }? var ?triangle?=?EquilateralTriangle(sideLength:?3.1,?name:?"a?triangle" )?triangle.perimeter? triangle.perimeter?=?9.9? triangle.sideLength?
注意:賦值器(setter)中,接收的值被自動(dòng)命名為newValue。
willSet和didSet
EquilateralTriangle的構(gòu)造器進(jìn)行了如下操作:
1.為子類型的屬性賦值。
2.調(diào)用父類型的構(gòu)造器。
3.修改父類型的屬性。
如果不需要計(jì)算屬性的值,但需要在賦值前后進(jìn)行一些操作的話,使用willSet和didSet:
class ?TriangleAndSquare?{?????var ?triangle:?EquilateralTriangle?{? ????willSet?{? ????????square.sideLength?=?newValue.sideLength? ????}? ????}? ????var ?square:?Square?{? ????willSet?{? ????????triangle.sideLength?=?newValue.sideLength? ????}? ????}? ????init(size:?Double,?name:?String)?{? ????????square?=?Square(sideLength:?size,?name:?name)? ????????triangle?=?EquilateralTriangle(sideLength:?size,?name:?name)? ????}? }? var ?triangleAndSquare?=?TriangleAndSquare(size:?10,?name:?"another?test?shape" )?triangleAndSquare.square.sideLength? triangleAndSquare.square?=?Square(sideLength:?50,?name:?"larger?square" )? triangleAndSquare.triangle.sideLength?
從而保證triangle和square擁有相等的sideLength。
調(diào)用方法
Swift中,函數(shù)的參數(shù)名稱只能在函數(shù)內(nèi)部使用,但方法的參數(shù)名稱除了在內(nèi)部使用外還可以在外部使用(第一個(gè)參數(shù)除外),例如:
class ?Counter?{?????var ?count:?Int?=?0? ????func?incrementBy(amount:?Int,?numberOfTimes?times:?Int)?{? ????????count?+=?amount?*?times? ????}? }? var ?counter?=?Counter()?counter.incrementBy(2,?numberOfTimes:?7)?
注意Swift支持為方法參數(shù)取別名:在上面的代碼里,numberOfTimes面向外部,times面向內(nèi)部。
?的另一種用途
使用可空值時(shí),?可以出現(xiàn)在方法、屬性或下標(biāo)前面。如果?前的值為nil,那么?后面的表達(dá)式會(huì)被忽略,而原表達(dá)式直接返回nil,例如:
1? 2? 3? let?optionalSquare:?Square??=?Square(sideLength:?2.5,?name:?"optional?? square")? let?sideLength?=?optionalSquare?.sideLength?
當(dāng)optionalSquare為nil時(shí),sideLength屬性調(diào)用會(huì)被忽略。
枚舉和結(jié)構(gòu)
枚舉
使用enum創(chuàng)建枚舉——注意Swift的枚舉可以關(guān)聯(lián)方法:
enum ?Rank:?Int?{?????case ?Ace?=?1? ????case ?Two,?Three,?Four,?Five,?Six,?Seven,?Eight,?Nine,?Ten? ????case ?Jack,?Queen,?King? ????????func?simpleDescription()?->?String?{? ????????switch ?self?{? ????????????case ?.Ace:? ????????????????return ?"ace" ? ????????????case ?.Jack:? ????????????????return ?"jack" ? ????????????case ?.Queen:? ????????????????return ?"queen" ? ????????????case ?.King:? ????????????????return ?"king" ? ????????????default :? ????????????????return ?String(self.toRaw())? ????????}? ????}? }? let?ace?=?Rank.Ace? let?aceRawValue?=?ace.toRaw()?
使用toRaw和fromRaw在原始(raw)數(shù)值和枚舉值之間進(jìn)行轉(zhuǎn)換:
if ?let?convertedRank?=?Rank.fromRaw(3)?{?????let?threeDescription?=?convertedRank.simpleDescription()? }?
注意:枚舉中的成員值(member value)是實(shí)際的值(actual value),和原始值(raw value)沒(méi)有必然關(guān)聯(lián)。
一些情況下枚舉不存在有意義的原始值,這時(shí)可以直接忽略原始值:
enum ?Suit?{?????case ?Spades,?Hearts,?Diamonds,?Clubs? ????????func?simpleDescription()?->?String?{? ????????switch ?self?{? ????????????case ?.Spades:? ????????????????return ?"spades" ? ????????????case ?.Hearts:? ????????????????return ?"hearts" ? ????????????case ?.Diamonds:? ????????????????return ?"diamonds" ? ????????????case ?.Clubs:? ????????????????return ?"clubs" ? ????????}? ????}? }? let?hearts?=?Suit.Hearts? let?heartsDescription?=?hearts.simpleDescription()?
除了可以關(guān)聯(lián)方法,枚舉還支持在其成員上關(guān)聯(lián)值,同一枚舉的不同成員可以有不同的關(guān)聯(lián)的值:
enum ?ServerResponse?{?????case ?Result(String,?String)? ????case ?Error(String)? }? ?? let?success?=?ServerResponse.Result("6:00?am" ,?"8:09?pm" )? let?failure?=?ServerResponse.Error("Out?of?cheese." )? ?? switch ?success?{?????case ?let?.Result(sunrise,?sunset):? ????????let?serverResponse?=?"Sunrise?is?at?\(sunrise)?and?sunset?is?at?\(sunset)." ? ????case ?let?.Error(error):? ????????let?serverResponse?=?"Failure...?\(error)" ? }?
結(jié)構(gòu)
Swift使用struct關(guān)鍵字創(chuàng)建結(jié)構(gòu)。結(jié)構(gòu)支持構(gòu)造器和方法這些類的特性。結(jié)構(gòu)和類的最大區(qū)別在于:結(jié)構(gòu)的實(shí)例按值傳遞(passed by value),而類的實(shí)例按引用傳遞(passed by reference)。
struct?Card?{? ????var ?rank:?Rank? ????var ?suit:?Suit? ????func?simpleDescription()?->?String?{? ????????return ?"The?\(rank.simpleDescription())?of?\(suit.simpleDescription())" ? ????}? }? let?threeOfSpades?=?Card(rank:?.Three,?suit:?.Spades)? let?threeOfSpadesDescription?=?threeOfSpades.simpleDescription()?
?
協(xié)議(protocol)和擴(kuò)展(extension)
協(xié)議
Swift使用protocol定義協(xié)議:
protocol?ExampleProtocol?{? ????var ?simpleDescription:?String?{?get?}? ????mutating?func?adjust()? }?
類型、枚舉和結(jié)構(gòu)都可以實(shí)現(xiàn)(adopt)協(xié)議:
class ?SimpleClass:?ExampleProtocol?{?????var ?simpleDescription:?String?=?"A?very?simple?class." ? ????var ?anotherProperty:?Int?=?69105? ????func?adjust()?{? ????????simpleDescription?+=?"?Now?100%?adjusted." ? ????}? }? var ?a?=?SimpleClass()?a.adjust()? let?aDescription?=?a.simpleDescription? ?? struct?SimpleStructure:?ExampleProtocol?{? ????var ?simpleDescription:?String?=?"A?simple?structure" ? ????mutating?func?adjust()?{? ????????simpleDescription?+=?"?(adjusted)" ? ????}? }? var ?b?=?SimpleStructure()?b.adjust()? let?bDescription?=?b.simpleDescription?
擴(kuò)展
擴(kuò)展用于在已有的類型上增加新的功能(比如新的方法或?qū)傩?#xff09;,Swift使用extension聲明擴(kuò)展:
extension?Int:?ExampleProtocol?{? ????var ?simpleDescription:?String?{? ????????return ?"The?number?\(self)" ? ????}? ????mutating?func?adjust()?{? ????????self?+=?42? ????}? }? 7.simpleDescription?
泛型(generics)
Swift使用<>來(lái)聲明泛型函數(shù)或泛型類型:
func?repeat<ItemType>(item:?ItemType,?times:?Int)?->?ItemType[]?{? ????var ?result?=?ItemType[]()? ????for ?i?in ?0..times?{? ????????result?+=?item? ????}? ????return ?result? }? repeat("knock" ,?4)?
Swift也支持在類、枚舉和結(jié)構(gòu)中使用泛型:
? enum ?OptionalValue<T>?{?????case ?None? ????case ?Some(T)? }? var ?possibleInteger:?OptionalValue<Int>?=?.None?possibleInteger?=?.Some(100)?
有時(shí)需要對(duì)泛型做一些需求(requirements),比如需求某個(gè)泛型類型實(shí)現(xiàn)某個(gè)接口或繼承自某個(gè)特定類型、兩個(gè)泛型類型屬于同一個(gè)類型等等,Swift通過(guò)where描述這些需求:
func?anyCommonElements?<T,?U?where?T:?Sequence,?U:?Sequence,?T.GeneratorType.Element:?Equatable,?T.GeneratorType.Element?==?U.GeneratorType.Element>?(lhs:?T,?rhs:?U)?->?Bool?{? ????for ?lhsItem?in ?lhs?{? ????????for ?rhsItem?in ?rhs?{? ????????????if ?lhsItem?==?rhsItem?{? ????????????????return ?true ? ????????????}? ????????}? ????}? ????return ?false ? }? anyCommonElements([1,?2,?3],?[3])?
Swift語(yǔ)言概覽就到這里,有興趣的朋友請(qǐng)進(jìn)一步閱讀The Swift Programming Language。
總結(jié)
以上是生活随笔 為你收集整理的Swift语言概览 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。