Swift窃侏歌深
椎乂宥械瓜凪万囂冱範葎頁児云賜兜雫議方象侏窃侏?Data types?——曳泌燕幣方忖、忖憲才忖憲堪——糞縞貧祥頁凋兆侏窃侏?Swift 炎彈垂頁聞喘潤更悶協吶才糞孖万断議。咀葎万断頁凋兆侏窃侏?咀緩低辛參梓孚“制婢才制婢蕗苧”嫗准戦網胎議椎劔?蕗苧匯倖制婢栖奐紗万断議佩葎參癖哘低殻會議俶箔。
鹸栽侏窃侏頁短嗤兆忖議窃侏?万喇 Swift 云附協吶。Swift 贋壓曾嶽鹸栽侏窃侏?痕方窃侏才圷怏窃侏。匯倖鹸栽侏窃侏辛參淫根凋兆侏窃侏才凪万鹸栽侏窃侏。箭泌?圷怏窃侏(Int, (Int, Int))淫根曾倖圷殆?及匯倖頁凋兆侏窃侏Int?及屈倖頁総匯倖鹸栽侏窃侏(Int, Int).
云准網胎 Swift 囂冱云附協吶議窃侏?旺宙峰 Swift 嶄議窃侏容僅佩葎。
窃侏議囂隈? type → array-type | function-type | type-identifier | tuple-type | optional-type | implicitly-unwrapped-optional-type | protocol-composition-type | metatype-type
窃侏廣盾
窃侏廣盾?塋週慟原38燦橳篩浸魃躊鑛週綴機?猥要⊇睚紗效虻?:嶮噐窃侏?曳泌和中曾倖箭徨?
let someTuple?(Double, Double) = (3.14159, 2.71828)
func someFunction(a: Int){ /* ... */ }
壓及匯倖箭徨嶄?燕器塀someTuple議窃侏瓜峺協葎(Double, Double)。壓及屈倖箭徨嶄?痕方someFunction議歌方a議窃侏瓜峺協葎Int。窃侏廣盾辛參壓窃侏岻念淫根匯倖窃侏蒙來?type attributes?議辛僉双燕。
窃侏廣盾議囂隈? type-annotation → :attributes[opt] type
窃侏炎紛憲
窃侏炎紛憲哈喘凋兆侏窃侏賜宀頁凋兆侏/鹸栽侏窃侏議艶兆。寄謹方秤趨和?窃侏炎紛憲哈喘議頁揖兆議凋兆侏窃侏。箭泌窃侏炎紛憲Int哈喘凋兆侏窃侏Int?揖劔?窃侏炎紛憲Dictionary<String, Int>哈喘凋兆侏窃侏Dictionary<String, Int>。
壓曾嶽秤趨和窃侏炎紛憲哈喘議音頁揖兆議窃侏。秤趨匯?窃侏炎紛憲哈喘議頁凋兆侏/鹸栽侏窃侏議窃侏艶兆。曳泌?壓和中議箭徨嶄?窃侏炎紛憲聞喘Point栖哈喘圷怏(Int, Int)?
typealias Point = (Int, Int) let origin: Point = (0, 0)秤趨屈?窃侏炎紛憲聞喘dot(.)囂隈栖燕幣壓凪万庁翠?modules?賜凪万窃侏廼耗坪蕗苧議凋兆侏窃侏。箭泌?和中箭徨嶄議窃侏炎紛憲哈喘壓ExampleModule庁翠嶄蕗苧議凋兆侏窃侏MyType?
var someValue: ExampleModule.MyType
窃侏炎紛憲議囂隈? type-identifier → type-name generic-argument-clause[opt] | type-name generic-argument-clause[opt].type-identifier type-name → identifier
圷怏窃侏
圷怏窃侏聞喘矯催侯蝕旺聞喘凄催凄軟栖議0倖賜謹倖窃侏怏撹議双燕。低辛參聞喘圷怏窃侏恬葎匯倖痕方議卦指窃侏?宸劔祥辛參聞痕方卦指謹倖峙。低匆辛參凋兆圷怏窃侏嶄議圷殆?隼朔喘宸乂兆忖栖哈喘耽倖圷殆議峙。圷殆議兆忖喇匯倖炎紛憲才:怏撹。“痕方才謹卦指峙”嫗准戦嗤匯倖婢幣貧峰蒙來議箭徨。
void頁腎圷怏窃侏()議艶兆。泌惚凄催坪峪嗤匯倖圷殆?椎担乎窃侏祥頁凄催坪圷殆議窃侏。曳泌?(Int)議窃侏頁Int遇音頁(Int)。侭參?峪嗤輝圷怏窃侏淫根曾倖圷殆參貧扮嘉辛參炎芝圷怏圷殆。
圷怏窃侏囂隈? tuple → (tuple-type-body[opt]) tuple-type-body → tuple-type-element-list ...[opt] tuple-type-element-list → tuple-type-element | tuple-type-element, tuple-type-element-list tuple-type-element → attributes[opt] inout [opt] type | inout [opt] element-name type-annotation element-name → identifier
痕方窃侏
痕方窃侏燕幣匯倖痕方、圭隈賜液淫議窃侏?万喇匯倖歌方窃侏才卦指峙窃侏怏撹?嶄寂喘収遊->侯蝕?parameter type -> return type
喇噐 歌方窃侏 才 卦指峙窃侏 辛參頁圷怏窃侏?侭參痕方窃侏辛參斑痕方嚥圭隈屶隔謹歌方嚥謹卦指峙。
低辛參斤痕方窃侏哘喘揮嗤歌方窃侏()旺卦指燕器塀窃侏議auto_closure奉來?需窃侏奉來嫗准?。匯倖徭強液淫痕方俺資蒙協燕器塀貧議咨塀液淫遇掲燕器塀云附。和中議箭徨聞喘auto_closure奉來栖協吶匯倖載酒汽議assert痕方?
func simpleAssert(condition: @auto_closure () -> Bool, message: String){
if !condition(){
println(message)
}
}
let testNumber = 5
simpleAssert(testNumber % 2 == 0, "testNumber isn't an even number.")
// prints "testNumber isn't an even number."
痕方窃侏辛參啜嗤匯倖辛延海歌方恬葎歌方窃侏嶄議恷朔匯倖歌方。貫囂隈叔業貧讐?辛延海歌方喇匯倖児粥窃侏兆忖才...怏撹?泌Int...。辛延海歌方瓜範葎頁匯倖淫根阻児粥窃侏圷殆議方怏。軸Int...祥頁Int[]。購噐聞喘辛延海歌方議箭徨?需嫗准“辛延海歌方”。葎阻峺協匯倖in-out歌方?辛參壓歌方窃侏念紗inout念弸。徽頁低音辛參斤辛延海歌方賜卦指峙窃侏聞喘inout。購噐In-Out歌方議網胎需嫗准In-Out歌方何蛍。
紳戦晒痕方?curried function?議窃侏屢輝噐匯倖廼耗痕方窃侏。箭泌?和中議紳戦晒痕方addTwoNumber()()議窃侏頁Int -> Int -> Int?
func addTwoNumbers(a: Int)(b: Int) -> Int{
return a + b
}
addTwoNumbers(4)(5) // returns 9
紳戦晒痕方議痕方窃侏貫嘔?恣怏撹匯怏。箭泌?痕方窃侏Int -> Int -> Int辛參瓜尖盾葎Int -> (Int -> Int)——匆祥頁傍?匯倖痕方勧秘匯倖Int隼朔補竃恬葎総匯倖痕方議補秘?隼朔嗽卦指匯倖Int。箭泌?低辛參聞喘泌和廼耗痕方栖嶷亟紳戦晒痕方addTwoNumbers()()?
func addTwoNumbers(a: Int) -> (Int -> Int){
func addTheSecondNumber(b: Int) -> Int{
return a + b
}
return addTheSecondNumber
}
addTwoNumbers(4)(5) // Returns 9
痕方窃侏議囂隈? function-type → type -> type
方怏窃侏
Swift囂冱聞喘窃侏兆諸俊嶄凄催[]栖酒晒炎彈垂嶄協吶議凋兆侏窃侏Array<T>。算鞘三傍?和中曾倖蕗苧頁吉勺議?let someArray: String[] = ["Alex", "Brian", "Dave"] let someArray: Array<String> = ["Alex", "Brian", "Dave"]貧中曾嶽秤趨和?械楚someArray脅瓜蕗苧葎忖憲堪方怏。方怏議圷殆匆辛參宥狛[]資函恵諒?someArray[0]頁峺及0倖圷殆“Alex”。
貧中議箭徨揖扮?塋升d秧敏塋荒?[]恬葎兜兵峙更夛方怏?腎議[]夸喘栖栖更夛峺協窃侏議腎方怏。
var emptyArray: Double[] = []低匆辛參聞喘全俊軟栖議謹倖[]鹿栽栖更夛謹略方怏。箭泌?和箭聞喘眉倖[]鹿栽栖更夛眉略屁侏方怏?
var array3D: Int[][][] = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]恵諒匯倖謹略方怏議圷殆扮?恷恣円議和炎峺?恷翌蚊方怏議屢哘了崔圷殆。俊和栖吏嘔議和炎峺?及匯蚊廼秘議屢哘了崔圷殆?卆肝窃容。宸祥吭龍彭?壓貧中議箭徨嶄?array3D[0]頁峺[[1, 2], [3, 4]]?array3D[0][1]頁峺[3, 4]?array3D[0][1][1]夸頁峺峙4。
購噐Swift炎彈垂嶄Array窃侏議聾准網胎?需嫗准Arrays。
方怏窃侏議囂隈? array-type → type[ ] | array-type[ ]
辛僉窃侏
Swift協吶朔弸?栖恬葎炎彈垂嶄議協吶議凋兆侏窃侏Optional<T>議酒亟。算鞘三傍?和中曾倖蕗苧頁吉勺議?var optionalInteger: Int? var optionalInteger: Optional<Int>壓貧峰曾嶽秤趨和?延楚optionalInteger脅瓜蕗苧葎辛僉屁侏窃侏。廣吭壓窃侏才?岻寂短嗤腎鯉。
窃侏Optional<T>頁匯倖旦訟?嗤曾嶽侘塀?None才Some(T)?嗽栖旗燕辛嬬竃孖賜辛嬬音竃孖議峙。販吭窃侏脅辛參瓜?塋週追禱?┿鰔鯁週鍔Ĺ撮ØĚ頻\猥諭5栄禱煆燦欵頻\猥擁隠h訓J荒胆┷展??戻工栽癖議恬喘袈律。曳泌傍?蕗苧匯倖屁侏議辛僉方怏?哘亟恬(Int[])??亟撹Int[]?議三夸氏竃危。
泌惚低壓蕗苧賜協吶辛僉延楚賜蒙來議扮昨短嗤戻工兜兵峙?万議峙夸氏徭強験撹髪福峙nil。
辛僉憲栽LogicValue亅咏?咀緩辛參竃孖壓下櫛峙桟廠和。緩扮?泌惚匯倖辛僉窃侏T?糞箭淫根嗤窃侏葎T議峙?匆祥頁傍峙葎Optional.Some(T)??椎担緩辛僉窃侏祥葎true?倦夸葎false。
泌惚匯倖辛僉窃侏議糞箭淫根匯倖峙?椎担低祥辛參聞喘朔弸荷恬憲!栖資函乎峙?屎泌和中宙峰議?
optionalInteger = 42 optionalInteger! // 42聞喘!荷恬憲資函峙葎nil議辛僉?氏擬崑塰佩危列?runtime error?。
低匆辛參聞喘辛僉全才辛僉鰯協栖僉夲來議峇佩辛僉燕器塀貧議荷恬。泌惚峙葎nil?音氏峇佩販採荷恬咀緩匆祥短嗤塰佩危列恢伏。
厚謹聾准參式厚謹泌採聞喘辛僉窃侏議箭徨?需嫗准“辛僉”。
辛僉窃侏囂隈? optional-type → type?
咨塀盾裂辛僉窃侏
Swift囂冱協吶朔弸!恬葎炎彈垂嶄凋兆窃侏ImplicitlyUnwrappedOptional<T>議酒亟。算鞘三傍?和中曾倖蕗苧吉勺?
var implicitlyUnwrappedString: String! var implicitlyUnwrappedString: ImplicitlyUnwrappedOptional<String>貧峰曾嶽秤趨和?延楚implicitlyUnwrappedString瓜蕗苧葎匯倖咨塀盾裂辛僉窃侏議忖憲堪。廣吭窃侏嚥!岻寂短嗤腎鯉。
低辛參壓聞喘辛僉議仇圭揖劔聞喘咨塀盾裂辛僉。曳泌?低辛參繍咨塀盾裂辛僉議峙験公延楚、械楚才辛僉蒙來?郡岻呀隼。
嗤阻辛僉?低壓蕗苧咨塀盾裂辛僉延楚賜蒙來議扮昨祥音喘峺協兜兵峙?咀葎万嗤髪福峙nil。
喇噐咨塀盾裂辛僉議峙氏壓聞喘扮徭強盾裂?侭參短駅勣聞喘荷恬憲!栖盾裂万。匆祥頁傍?泌惚低聞喘峙葎nil議咨塀盾裂辛僉?祥氏擬崑塰佩危列。
聞喘辛僉全氏僉夲來議峇佩咨塀盾裂辛僉燕器塀貧議蝶匯倖荷恬。泌惚峙葎nil?祥音氏峇佩販採荷恬?咀緩匆音氏恢伏塰佩危列。
購噐咨塀盾裂辛僉議厚謹聾准?需嫗准“咨塀盾裂辛僉”。
咨塀盾裂辛僉議囂隈? implicitly-unwrapped-optional-type → type!
亅咏栽撹窃侏
亅咏栽撹窃侏頁匯嶽憲栽耽倖亅咏議峺協亅咏双燕窃侏。亅咏栽撹窃侏辛嬬氏喘壓窃侏廣盾才刑侏歌方嶄。亅咏栽撹窃侏議侘塀泌和?
protocol<Protocol 1, Procotol 2>
亅咏栽撹窃侏塋俯低峺協匯倖峙?凪窃侏辛參癖塘謹倖亅咏議訳周?遇拝音俶勣協吶匯倖仟議凋兆侏亅咏栖写覚凪万?勣癖塘議光倖亅咏。曳泌?亅咏栽撹窃侏protocol<Protocol A, Protocol B, Protocol C>吉丼噐匯倖貫Protocol A?Protocol B? Protocol C写覚遇栖議仟亅咏Protocol D?載?堡師睹竎?佩?糞超爍i枘漸姉菻鐳誨燦氳唾蛼屐?
亅咏栽撹双燕嶄議耽?駅倬頁亅咏兆賜亅咏栽撹窃侏議窃侏艶兆。泌惚双燕葎腎?万祥氏峺協匯倖腎亅咏栽撹双燕?宸劔耽倖窃侏脅嬬癖塘。
亅咏栽撹窃侏議囂隈? protocol-composition-type → protocol <protocol-identifier-list[opt]> protocol-identifier-list → protocol-identifier | protocol-identifier, protocol-identifier-list protocol-identifier → type-identifier
圷窃侏
圷窃侏頁峺侭嗤窃侏議窃侏?淫凄窃、潤更悶、旦訟才亅咏。窃、潤更悶賜旦訟窃侏議圷窃侏頁屢哘議窃侏兆諸効.Type。亅咏窃侏議圷窃侏——旺音頁塰佩扮癖塘乎亅咏議醤悶窃侏——頁乎亅咏兆忖諸効.Protocol。曳泌?窃SomeClass議圷窃侏祥頁SomeClass.Type?亅咏SomeProtocol議圷窃侏祥頁SomeProtocal.Protocol。
低辛參聞喘朔弸self燕器塀栖資函窃侏。曳泌?SomeClass.self卦指SomeClass云附?遇音頁SomeClass議匯倖糞箭。揖劔?SomeProtocol.self卦指SomeProtocol云附?遇音頁塰佩扮癖塘SomeProtocol議蝶倖窃侏議糞箭。珊辛參斤窃侏議糞箭聞喘dynamicType燕器塀栖資函乎糞箭壓塰佩竣粁議窃侏?泌和侭幣?
class SomeBaseClass {
class func printClassName() {
println("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
println("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
// someInstance is of type SomeBaseClass at compile time, but
// someInstance is of type SomeSubClass at runtime
someInstance.dynamicType.printClassName()
// prints "SomeSubClass
圷窃侏議囂隈? metatype-type → type.Type | type.Protocol
窃侏写覚徨鞘
窃侏写覚徨鞘瓜喘栖峺協匯倖凋兆侏窃侏写覚陳倖窃拝癖塘陳乂亅咏。窃侏写覚徨鞘蝕兵噐丹催:?諸効喇,侯蝕議窃侏炎紛憲双燕。窃辛參写覚汽倖階窃?癖塘販吭方楚議亅咏。輝協吶匯倖窃扮?階窃議兆忖駅倬竃孖壓窃侏炎紛憲双燕遍了?隼朔効貧乎窃俶勣癖塘議販吭方楚議亅咏。泌惚匯倖窃音頁貫凪万窃写覚遇栖?椎担双燕辛參參亅咏蝕遊。購噐窃写覚厚謹議網胎才箭徨?需嫗准“写覚”。
凪万凋兆侏窃侏辛嬬峪写覚賜癖塘匯倖亅咏双燕。亅咏窃侏辛嬬写覚噐凪万販吭方楚議亅咏。輝匯倖亅咏窃侏写覚噐凪万亅咏扮?凪万亅咏議訳周鹿栽氏瓜鹿撹壓匯軟?隼朔凪万貫輝念亅咏写覚議販吭窃侏駅倬癖塘侭嗤宸乂訳周。
旦訟協吶嶄議窃侏写覚徨鞘辛參頁匯倖亅咏双燕?賜頁峺協圻兵峙議旦訟?匯倖汽鏡議峺協圻兵峙窃侏議凋兆侏窃侏。聞喘窃侏写覚徨鞘栖峺協圻兵峙窃侏議旦訟協吶議箭徨?需嫗准“圻兵峙”。
窃侏写覚徨鞘議囂隈? type-inheritance-clause → :type-inheritance-list type-inheritance-list → type-identifier | type-identifier, type-inheritance-list
窃侏容僅
Swift鴻刑議聞喘窃侏容僅?貫遇塋俯低辛參策待載謹延楚才燕器塀議窃侏賜何蛍窃侏。曳泌?斤噐var x: Int = 0?低辛參頼畠策待窃侏遇酒亟撹var x = 0——園咎匂氏屎鳩議容僅竃x議窃侏Int。窃貌議?輝頼屁議窃侏辛參貫貧和猟容僅竃栖扮?低匆辛參策待窃侏議匯何蛍。曳泌?泌惚低亟阻let dict: Dictionary = ["A": 1]?園咎戻匆嬬容僅竃dict議窃侏頁Dictionary<String, Int>。壓貧中議曾倖箭徨嶄?窃侏佚連貫燕器塀峯?expression tree?議匐徨准泣勧?功准泣。匆祥頁傍?var x: Int = 0嶄x議窃侏遍枠功象0議窃侏序佩容僅?隼朔繍乎窃侏佚連勧弓欺功准泣?延楚x?。
壓Swift嶄?窃侏佚連匆辛參郡圭?送強——貫功准泣勧?匐徨准泣。壓和中議箭徨嶄?械楚eFloat貧議?塋柔猥要⊇癸?:Float?擬崑方忖忖中楚2.71828議窃侏頁Float遇掲Double。
let e = 2.71828 // The type of e is inferred to be Double. let eFloat: Float = 2.71828 // The type of eFloat is Float.Swift嶄議窃侏容僅壓汽鏡議燕器塀賜囂鞘邦峠貧序佩。宸吭龍彭侭嗤喘噐容僅窃侏議佚連駅倬辛參貫燕器塀賜凪蝶倖徨燕器塀議窃侏殊臥嶄資函。