Swift窃侏廬算
<貧匯准
和匯准>
窃侏廬算頁匯嶽殊臥窃糞箭議圭塀?旺拝填賜宀匆頁斑糞箭恬葎万議幻窃賜宀徨窃議匯嶽圭塀。
窃侏廬算壓Swift嶄聞喘is 才 as荷恬憲糞孖。宸曾倖荷恬憲戻工阻匯嶽酒汽器吭議圭塀肇殊臥峙議窃侏賜宀廬算万議窃侏。
低匆辛參喘栖殊臥匯倖窃頁倦糞孖阻蝶倖亅咏?祥崧壓 Protocols〃Checking for Protocol Conformance何蛍讐峰議匯劔。
及匯倖旗鷹頭粁協吶阻匯倖仟議児粥窃MediaItem。宸倖窃葎販採竃孖壓方忖箪悶垂議?戻工児粥孔嬬。蒙艶議?万蕗苧阻匯倖 String 窃侏議 name 奉來?才匯倖init name兜兵晒匂。?万邪協侭嗤議箪悶?脅嗤倖兆各。?
和中議箭徨協吶阻銭倖延楚?movieCount 才 songCount?喘栖柴麻方怏library 嶄 Movie 才 Song 窃侏議糞箭方楚。
飛輝念 MediaItem 頁匯倖 Movie 窃侏議糞箭? item is Movie 卦指 true?屢郡卦指 false。揖劔議?item is Song殊臥item頁倦葎Song窃侏議糞箭。壓儉桟挑硫?movieCount 才 songCount議峙祥頁瓜孀欺奉噐光徭議窃侏議糞箭方楚。
咀葎?和廬侏辛嬬氏払移?窃侏廬算荷恬憲揮嗤曾嶽音揖侘塀。辛僉侘塀? optional form? as? 卦指匯倖低編夕和廬撹議窃侏議辛僉峙?optional value?。膿崙侘塀 as 委編夕?和廬侏才膿崙盾淫?force-unwraps?潤惚恬葎匯倖詞栽強恬。
輝低音鳩協和廬辛參撹孔扮?喘窃侏廬算議辛僉侘塀(as?)。辛僉侘塀議窃侏廬算悳頁卦指匯倖辛僉峙?optional value??旺拝飛和廬頁音辛嬬議?辛僉峙繍頁 nil 。宸聞低嬬校殊臥和廬頁倦撹孔。
峪嗤低辛參鳩協和廬匯協氏撹孔扮?嘉聞喘膿崙侘塀。輝低編夕和廬葎匯倖音屎鳩議窃侏扮?膿崙侘塀議窃侏廬算氏乾窟匯倖runtime error。
和中議箭徨?亨旗阻library戦議耽匯倖 MediaItem ?旺嬉咫竃癖輝議宙峰。勣宸劔恂?item俶勣寔屎恬葎Movie 賜 Song議窃侏栖聞喘。音叙叙頁恬葎 MediaItem。葎阻嬬校聞喘Movie 賜 Song議 director 賜 artist奉來?宸頁駅勣議。
壓宸倖幣箭嶄?方怏嶄議耽匯倖item辛嬬頁 Movie 賜 Song。 並念低音岑祇耽倖item議寔糞窃侏?侭參宸戦聞喘辛僉侘塀議窃侏廬算 (as?)肇殊臥儉桟戦議耽肝和廬。
輝哘喘壓曾倖Song糞箭扮?和廬葎 Movie 払移。葎阻侃尖宸嶽秤趨?貧中議糞箭聞喘阻辛僉鰯協?optional binding?栖殊臥optional Movie寔議淫根匯倖峙?宸倖頁葎阻登僅和廬頁倦撹孔。?辛僉鰯協頁宸劔亟議“if let movie = item as? Movie”,辛參宸劔盾響?“晦編繍 item 廬葎 Movie窃侏。飛撹孔?譜崔匯倖仟議匝扮械楚 movie 栖贋刈卦指議optional Movie”
飛和廬撹孔?隼朔movie議奉來繍喘噐嬉咫匯倖Movie糞箭議宙峰?淫凄万議擬處議兆忖director。輝Song瓜孀欺扮?匯倖屢除議圻尖瓜喘栖殊霞 Song 糞箭才嬉咫万議宙峰。
AnyObject辛參旗燕販採class窃侏議糞箭。
Any辛參燕幣販採窃侏?茅阻圭隈窃侏?function types?。
廣吭?峪嗤輝低苧鳩議俶勣万議佩葎才孔嬬扮嘉聞喘Any才AnyObject。壓低議旗鷹戦聞喘低豚李議苧鳩議窃侏悳頁厚挫議。
壓宸乂秤趨和?低辛參聞喘膿崙侘塀議窃侏廬算(as)栖和廬壓方怏嶄議耽匯?欺曳 AnyObject 厚苧鳩議窃侏?音俶勣辛僉盾淫?optional unwrapping?。
和中議幣箭協吶阻匯倖 AnyObject[] 窃侏議方怏旺野秘眉倖Movie窃侏議糞箭?
低辛參壓 switch cases戦喘is 才 as 荷恬憲栖窟状峪岑祇頁 Any 賜 AnyObject議械楚賜延楚議窃侏。 和中議幣箭亨旗 things方怏嶄議耽匯?議旺喘switch囂鞘臥孀耽匯?議窃侏。宸叱嶽switch囂鞘議秤侘鰯協万断謄塘議峙欺匯倖号協窃侏議械楚?斑万断辛參嬉咫万断議峙?
窃侏廬算壓Swift嶄聞喘is 才 as荷恬憲糞孖。宸曾倖荷恬憲戻工阻匯嶽酒汽器吭議圭塀肇殊臥峙議窃侏賜宀廬算万議窃侏。
低匆辛參喘栖殊臥匯倖窃頁倦糞孖阻蝶倖亅咏?祥崧壓 Protocols〃Checking for Protocol Conformance何蛍讐峰議匯劔。
協吶匯倖窃蚊肝恬葎箭徨
低辛參繍万喘壓窃才徨窃議蚊肝潤更貧?殊臥蒙協窃糞箭議窃侏旺拝廬算宸倖窃糞箭議窃侏撹葎宸倖蚊肝潤更嶄議凪麿窃侏。宸和中議眉倖旗鷹粁協吶阻匯倖窃蚊肝才匯倖array淫根阻叱倖宸乂窃議糞箭?恬葎窃侏廬算議箭徨。及匯倖旗鷹頭粁協吶阻匯倖仟議児粥窃MediaItem。宸倖窃葎販採竃孖壓方忖箪悶垂議?戻工児粥孔嬬。蒙艶議?万蕗苧阻匯倖 String 窃侏議 name 奉來?才匯倖init name兜兵晒匂。?万邪協侭嗤議箪悶?脅嗤倖兆各。?
class MediaItem {
var name: String
init(name: String) {
self.name = name
}
}
和匯倖旗鷹粁協吶阻 MediaItem 議曾倖徨窃。及匯倖徨窃Movie?壓幻窃?賜宀傍児窃?議児粥貧奐紗阻匯倖 director?擬處? 奉來?才屢哘議兜兵晒匂。及屈倖窃壓幻窃議児粥貧奐紗阻匯倖 artist?簒宝社? 奉來?才屢哘議兜兵晒匂?
class Movie: MediaItem {
var director: String
init(name: String, director: String) {
self.director = director
super.init(name: name)
}
}
class Song: MediaItem {
var artist: String
init(name: String, artist: String) {
self.artist = artist
super.init(name: name)
}
}
恷朔匯倖旗鷹粁幹秀阻匯倖array械楚 library ?淫根曾倖Movie糞箭才眉倖Song糞箭。library議窃侏頁壓万瓜兜兵晒扮功象万議array炎芝憲才戦中議坪否?ps: literal? 炎芝憲凪糞祥頁峺“[”才“]”?埋隼道惚郊圭議鍬咎戦鍬咎葎忖中輝悳湖状音挫尖盾?嗤泣謎講。音泌鍬咎葎炎芝憲?容僅栖議。Swift議窃侏殊霞匂嬬校處呰竃Movie 才 Song 嗤慌揖議幻窃 MediaItem ?侭參万容僅竃 MediaItem[] 窃恬葎 library 議窃侏。
let library = [ Movie(name: "Casablanca", director: "Michael Curtiz"), Song(name: "Blue Suede Shoes", artist: "Elvis Presley"), Movie(name: "Citizen Kane", director: "Orson Welles"), Song(name: "The One And Only", artist: "Chesney Hawkes"), Song(name: "Never Gonna Give You Up", artist: "Rick Astley") ] // the type of "library" is inferred to be MediaItem[]壓鳥朔library 戦贋刈議?卆隼頁 Movie 才 Song 窃侏議?徽頁?飛低亨旗万?函竃議糞箭氏頁 MediaItem 窃侏議?遇音頁 Movie 才 Song 窃侏議。葎阻斑万断恬葎万断云栖議窃侏垢恬?低俶勣殊臥万断議窃侏賜宀?和廬算万断議窃侏欺凪万窃侏?祥崧和中宙峰議匯劔。
殊臥窃侏
喘窃侏殊臥荷恬憲(is)栖殊臥匯倖糞箭頁倦奉噐蒙協徨窃侏。窃侏殊臥荷恬憲卦指 true 飛糞箭奉噐椎倖徨窃侏?飛音奉噐卦指 false 。和中議箭徨協吶阻銭倖延楚?movieCount 才 songCount?喘栖柴麻方怏library 嶄 Movie 才 Song 窃侏議糞箭方楚。
var movieCount = 0
var songCount = 0
for item in library {
if item is Movie {
++movieCount
} else if item is Song {
++songCount
}
}
println("Media library contains \(movieCount) movies and \(songCount) songs")
// prints "Media library contains 2 movies and 3 songs"
幣箭亨旗阻方怏 library 嶄議侭嗤?。耽匯肝? for-in 儉桟譜崔 item 械楚議峙葎方怏嶄議和匯倖 MediaItem。飛輝念 MediaItem 頁匯倖 Movie 窃侏議糞箭? item is Movie 卦指 true?屢郡卦指 false。揖劔議?item is Song殊臥item頁倦葎Song窃侏議糞箭。壓儉桟挑硫?movieCount 才 songCount議峙祥頁瓜孀欺奉噐光徭議窃侏議糞箭方楚。
?和廬侏?酒各和廬?
蝶窃侏議匯倖械楚賜延楚辛嬬壓鳥朔糞縞貧奉噐匯倖徨窃。低辛參屢佚?貧中祥頁宸嶽秤趨。低辛參晦編?和廬欺万議徨窃侏?喘窃侏廬算荷恬憲(as)咀葎?和廬侏辛嬬氏払移?窃侏廬算荷恬憲揮嗤曾嶽音揖侘塀。辛僉侘塀? optional form? as? 卦指匯倖低編夕和廬撹議窃侏議辛僉峙?optional value?。膿崙侘塀 as 委編夕?和廬侏才膿崙盾淫?force-unwraps?潤惚恬葎匯倖詞栽強恬。
輝低音鳩協和廬辛參撹孔扮?喘窃侏廬算議辛僉侘塀(as?)。辛僉侘塀議窃侏廬算悳頁卦指匯倖辛僉峙?optional value??旺拝飛和廬頁音辛嬬議?辛僉峙繍頁 nil 。宸聞低嬬校殊臥和廬頁倦撹孔。
峪嗤低辛參鳩協和廬匯協氏撹孔扮?嘉聞喘膿崙侘塀。輝低編夕和廬葎匯倖音屎鳩議窃侏扮?膿崙侘塀議窃侏廬算氏乾窟匯倖runtime error。
和中議箭徨?亨旗阻library戦議耽匯倖 MediaItem ?旺嬉咫竃癖輝議宙峰。勣宸劔恂?item俶勣寔屎恬葎Movie 賜 Song議窃侏栖聞喘。音叙叙頁恬葎 MediaItem。葎阻嬬校聞喘Movie 賜 Song議 director 賜 artist奉來?宸頁駅勣議。
壓宸倖幣箭嶄?方怏嶄議耽匯倖item辛嬬頁 Movie 賜 Song。 並念低音岑祇耽倖item議寔糞窃侏?侭參宸戦聞喘辛僉侘塀議窃侏廬算 (as?)肇殊臥儉桟戦議耽肝和廬。
for item in library {
if let movie = item as? Movie {
println("Movie: '\(movie.name)', dir. \(movie.director)")
} else if let song = item as? Song {
println("Song: '\(song.name)', by \(song.artist)")
}
}
// Movie: 'Casablanca', dir. Michael Curtiz
// Song: 'Blue Suede Shoes', by Elvis Presley
// Movie: 'Citizen Kane', dir. Orson Welles
// Song: 'The One And Only', by Chesney Hawkes
// Song: 'Never Gonna Give You Up', by Rick Astley
幣箭遍枠編夕繍 item 和廬葎 Movie。咀葎 item 頁匯倖 MediaItem 窃侏議糞箭?万辛嬬頁匯倖Movie?揖劔?万辛嬬頁匯倖 Song?賜宀叙叙頁児窃 MediaItem。咀葎音鳩協?as?侘塀編夕和廬扮卦珊匯倖辛僉峙。 item as Movie 議卦指峙頁Movie?窃侏賜 “optional Movie”。輝哘喘壓曾倖Song糞箭扮?和廬葎 Movie 払移。葎阻侃尖宸嶽秤趨?貧中議糞箭聞喘阻辛僉鰯協?optional binding?栖殊臥optional Movie寔議淫根匯倖峙?宸倖頁葎阻登僅和廬頁倦撹孔。?辛僉鰯協頁宸劔亟議“if let movie = item as? Movie”,辛參宸劔盾響?“晦編繍 item 廬葎 Movie窃侏。飛撹孔?譜崔匯倖仟議匝扮械楚 movie 栖贋刈卦指議optional Movie”
飛和廬撹孔?隼朔movie議奉來繍喘噐嬉咫匯倖Movie糞箭議宙峰?淫凄万議擬處議兆忖director。輝Song瓜孀欺扮?匯倖屢除議圻尖瓜喘栖殊霞 Song 糞箭才嬉咫万議宙峰。
廣吭?廬算短嗤寔議個延糞箭賜万議峙。捻壓議功云議糞箭隠隔音延?峪頁酒汽仇委万恬葎万瓜廬算撹議窃栖聞喘。
Any才AnyObject議廬算
Swift葎音鳩協窃侏戻工阻曾嶽蒙歩窃侏艶兆?AnyObject辛參旗燕販採class窃侏議糞箭。
Any辛參燕幣販採窃侏?茅阻圭隈窃侏?function types?。
廣吭?峪嗤輝低苧鳩議俶勣万議佩葎才孔嬬扮嘉聞喘Any才AnyObject。壓低議旗鷹戦聞喘低豚李議苧鳩議窃侏悳頁厚挫議。
AnyObject窃侏
輝俶勣壓垢恬嶄聞喘Cocoa APIs?万匯違俊辺匯倖AnyObject[]窃侏議方怏?賜宀傍“匯倖販採斤嵆窃侏議方怏”。宸頁咀葎OC短嗤苧鳩議窃侏晒方怏。徽頁?低械械辛參鳩協淫根壓叙貫低岑祇議API佚連戻工議宸劔匯倖方怏嶄議斤嵆議窃侏。壓宸乂秤趨和?低辛參聞喘膿崙侘塀議窃侏廬算(as)栖和廬壓方怏嶄議耽匯?欺曳 AnyObject 厚苧鳩議窃侏?音俶勣辛僉盾淫?optional unwrapping?。
和中議幣箭協吶阻匯倖 AnyObject[] 窃侏議方怏旺野秘眉倖Movie窃侏議糞箭?
let someObjects: AnyObject[] = [ Movie(name: "2001: A Space Odyssey", director: "Stanley Kubrick"), Movie(name: "Moon", director: "Duncan Jones"), Movie(name: "Alien", director: "Ridley Scott") ]咀葎岑祇宸倖方怏峪淫根 Movie 糞箭?低辛參岷俊喘(as)和廬旺盾淫欺音辛僉議Movie窃侏?ps?凪糞祥頁厘断械喘議屎械窃侏?宸戦頁葎阻才辛僉窃侏屢斤曳?。
for object in someObjects {
let movie = object as Movie
println("Movie: '\(movie.name)', dir. \(movie.director)")
}
// Movie: '2001: A Space Odyssey', dir. Stanley Kubrick
// Movie: 'Moon', dir. Duncan Jones
// Movie: 'Alien', dir. Ridley Scott
葎阻延葎匯倖厚玉議侘塀?和廬someObjects窃侏撹孔 Movie[] 窃侏旗紋和廬耽匯?。
for movie in someObjects as Movie[] {
println("Movie: '\(movie.name)', dir. \(movie.director)")
}
// Movie: '2001: A Space Odyssey', dir. Stanley Kubrick
// Movie: 'Moon', dir. Duncan Jones
// Movie: 'Alien', dir. Ridley Scott
Any窃侏
宸戦嗤倖幣箭?聞喘 Any 窃侏栖才詞栽議音揖窃侏匯軟垢恬?淫凄掲class窃侏。万幹秀阻匯倖辛參贋刈Any窃侏議方怏 things。
var things = Any[]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Movie(name: "Ghostbusters", director: "Ivan Reitman"))
things 方怏淫根曾倖 Int 峙?2倖 Double 峙?1倖 String 峙?匯倖圷怏 (Double, Double) ?Ivan Reitman擬處議窮唹“Ghostbusters”。低辛參壓 switch cases戦喘is 才 as 荷恬憲栖窟状峪岑祇頁 Any 賜 AnyObject議械楚賜延楚議窃侏。 和中議幣箭亨旗 things方怏嶄議耽匯?議旺喘switch囂鞘臥孀耽匯?議窃侏。宸叱嶽switch囂鞘議秤侘鰯協万断謄塘議峙欺匯倖号協窃侏議械楚?斑万断辛參嬉咫万断議峙?
for thing in things {
switch thing {
case 0 as Int:
println("zero as an Int")
case 0 as Double:
println("zero as a Double")
case let someInt as Int:
println("an integer value of \(someInt)")
case let someDouble as Double where someDouble > 0:
println("a positive double value of \(someDouble)")
case is Double:
println("some other double value that I don't want to print")
case let someString as String:
println("a string value of \"\(someString)\"")
case let (x, y) as (Double, Double):
println("an (x, y) point at \(x), \(y)")
case let movie as Movie:
println("a movie called '\(movie.name)', dir. \(movie.director)")
default:
println("something else")
}
}
// zero as an Int
// zero as a Double
// an integer value of 42
// a positive double value of 3.14159
// a string value of "hello"
// an (x, y) point at 3.0, 5.0
// a movie called 'Ghostbusters', dir. Ivan Reitman
廣吭?壓匯倖switch囂鞘議case嶄聞喘膿崙侘塀議窃侏廬算荷恬憲(as, 遇音頁 as?) 栖殊臥才廬算欺匯倖号協議窃侏。壓switch case 囂鞘議坪否嶄宸嶽殊臥悳頁芦畠議。
<貧匯准
和匯准>