遍匈 / Swift / Swift縮殻 /

Swift亅咏

<貧匯准 和匯准>

亅咏協吶阻匯倖圭隈議清夕?奉來才凪麿癖栽蒙協販暦賜孔嬬議勣箔。亅咏糞縞貧旺音戻工匯倖宸乂勣箔議糞孖?万峪頁宙峰阻匯倖糞孖氏頁焚担劔徨。亅咏辛參宥狛匯倖窃?潤更賜旦訟戻工宸乂勣箔議醤悶糞孖。諾怎勣箔議販採窃侏議亅咏脅頁憲栽亅咏。

亅咏辛參勣箔憲栽窃侏嗤蒙協議糞箭奉來?糞箭圭隈?窃侏戟源?荷恬憲才和炎。

亅咏議囂隈

協吶亅咏嚥協吶窃?潤更?旦訟掲械屢貌

protocol SomeProtocol {
 // protocol definition goes here
}

協崙窃侏彜蓑?麿断寡喘匯嶽蒙協議亅咏?宥狛繍亅咏兆圭壓窃侏兆岻朔?喘丹催蛍護?輝恬協吶議匯何蛍。辛參双竃謹倖亅咏?喇矯催蛍侯?

struct SomeStructure: FirstProtocol, AnotherProtocol {
 // protocol definition goes here
}

泌惚匯倖窃嗤幻窃?壓販採亅咏岻念双竃幻窃兆?朔効匯倖矯催?

class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {
 // protocol definition goes here
}

奉來勣箔

匯倖亅咏辛參勣箔販採憲栽窃侏戻工匯倖糞箭奉來賜窃侏奉來嚥匯倖蒙協議兆各才窃侏。亅咏音峺協頁倦乎奉來哘乎頁匯倖贋刈奉來賜宀柴麻奉來--万峪峺協侭俶議奉來兆各才窃侏。亅咏珊崙協頁倦耽倖奉來駅倬辛資函賜辛資函才辛譜崔。

泌惚匯倖亅咏俶勣匯倖奉來頁辛資函才辛譜崔議?椎担匯倖械楚贋刈奉來賜匯倖峪響議柴麻奉來頁涙隈諾怎緩奉來勣箔議。泌惚亅咏岻俶勣匯倖奉來頁辛資函議?椎担販採窃侏議奉來脅嬬諾怎緩勣箔?旺拝泌惚宸斤低旗鷹嗤喘?万揖劔頁嗤丼議?匆頁辛譜崔議。

奉來勣箔悳頁蕗苧葎延楚奉來?喘var購囚忖恂念弸。辛資函才辛譜崔奉來頁宥狛壓麿断窃侏蕗苧朔園亟{ get set }圭隈?旺拝辛資函奉來頁宥狛園亟{ get }圭隈。

protocol SomeProtocol {
 var mustBeSettable: Int { get set }
 var doesNotNeedToBeSettable: Int { get }
}

輝低壓亅咏嶄協吶麿断扮?悳頁勣壓窃侏奉來勣箔念紗class購囚忖恬葎念弸。軸聞万瓜潤更賜旦訟糞孖扮?窃侏奉來勣箔聞喘static購囚簡恂念弸匆頁匯劔。

protocol FullyNamed {
 var fullName: String { get }
}

FullyNamed亅咏協吶阻販採窃侏議並秤脅嗤匯倖頼屁尫協兆各。万音峺協万駅倬頁焚担劔議並秤--万峪峺協緩並駅倬公徭失戻工匯倖頼屁議兆各。万峺協宸匯勣箔?号協販採FullyNamed窃侏駅倬嗤匯倖辛資誼糞箭奉來fullName?遇拝頁String窃侏

宸戦嗤匯倖潤更酒汽議箭徨,寡喘憲栽FullyNamed亅咏議

struct Person: FullyNamed {
 var fullName: String
}
let john = Person(fullName: "John Appleseed")
// john.fullName is "John Appleseed"

緩箭協吶阻匯倖出Person議潤更?凪旗燕匯倖蒙協兆忖議繁。万号協 寡喘FullyNamed亅咏輝恬凪協吶何蛍議及匯佩。

耽倖Person糞箭脅嗤匯倖汽鏡議贋刈奉來fullName?拝窃侏葎String。宸憲栽FullyNamed亅咏議勣箔?宸吭龍彭Person亅咏嗤屎鳩憲栽亅咏。?泌惚壓園咎扮音諾怎亅咏勣箔?Swift氏烏竃匯倖危列?

宸戦嗤匯倖厚鹸墫議窃,万匆寡喘旺憲栽FullyNamed亅咏:

class Starship: FullyNamed {
 var prefix: String?
 var name: String
 init(name: String, prefix: String? = nil) {
 self.name = name
 self.prefix = prefix
 }
 var fullName: String {
 return (prefix ? prefix! + " " : "") + name
 }
}
var ncc1701 = Starship(name: "Enterprise", prefix: "USS")
// ncc1701.fullName is "USS Enterprise"

緩窃糞孖阻fullName奉來勣箔恬葎Starship議峪響柴麻奉來。耽倖Starship窃糞箭贋刈匯倖膿崙來議name才匯倖辛僉議prefix。泌惚fullName贋壓祥頁喘prefix?旺拝戻念彈姥參name蝕遊肇幹秀Starship議畠兆。

圭隈勣箔

亅咏辛參勣箔峺協糞箭圭隈才窃侏圭隈瓜匯崑議窃侏糞孖。宸乂圭隈瓜亟葎亅咏協吶議匯何蛍?効噸宥糞箭才窃侏圭隈頼畠匯劔?徽頁短嗤寄凄催賜圭隈悶。辛延歌方頁塋俯議?噸宥圭隈匆恆儉揖劔議号夸。

廣吭?亅咏葎噸宥圭隈聞喘屢揖議囂隈?徽音塋俯公圭隈歌方峺協潮範峙。

揖窃侏奉來俶箔?輝麿断瓜協吶欺亅咏嶄扮?悳頁俶勣壓圭隈俶箔念紗class購囚忖念弸。軸聞万瓜潤更賜旦訟糞孖扮?窃侏奉來勣箔聞喘static購囚簡恂念弸匆頁匯劔。

protocol SomeProtocol {
 class func someTypeMethod()
}

和中議箭徨協吶阻匯倖汽倖糞箭圭隈勣箔議亅咏:

protocol RandomNumberGenerator {
 func random() -> Double
}

RandomNumberGenerator亅咏勣箔販採憲栽窃侏脅嗤匯倖出恂random議糞箭圭隈?壓販採瓜距喘扮昨脅卦指匯倖Double峙。?勝砿万短嗤峺協凪恬葎亅咏議匯何蛍?範葎緩峙頁壓0.0欺1.0岻寂議方忖。?

RandomNumberGenerator亅咏音恂購噐耽倖昧字方頁泌採伏撹議邪譜--万叙勣箔伏撹匂戻工匯倖炎彈議圭塀肇伏撹匯倖昧字方。

宸戦嗤匯倖憲栽RandomNumberGenerator亅咏議糞孖窃。緩窃糞孖阻匯嶽留昧字方伏撹匂麻隈各葎?來揖噫伏撹匂。

class LinearCongruentialGenerator: RandomNumberGenerator {
 var lastRandom = 42.0
 let m = 139968.0
 let a = 3877.0
 let c = 29573.0
 func random() -> Double {
 lastRandom = ((lastRandom * a + c) % m)
 return lastRandom / m
 }
}
let generator = LinearCongruentialGenerator()
println("Here's a random number: \(generator.random())")
// prints "Here's a random number: 0.37464991998171"
println("And another one: \(generator.random())")
// prints "And another one: 0.729023776863283"
Mutating Method Requirements

Mutating圭隈勣箔

嗤扮俶勣匯倖圭隈栖俐個万奉噐(賜mutate)議糞箭。斤峙窃侏糞箭圭隈?軸潤更才旦訟??低繍mutating購囚忖慧壓圭隈func購囚忖岻念燕苧乎圭隈塋俯俐個侭奉糞箭才/賜糞箭議販採奉來。宸倖狛殻宙峰壓糞箭圭隈坪俐個峙窃侏

泌惚低協吶匯倖亅咏糞箭圭隈勣箔崋壓個延寡喘緩亅咏議販採窃侏糞箭,炎芝嗤mutating購囚忖議圭隈葎亅咏協吶議匯何蛍。宸聞誼潤更才旦訟寡喘亅咏旺諾怎緩圭隈勣箔。

廣吭?泌惚低炎芝匯倖亅咏糞箭圭隈俶箔恬葎mutating? 輝葎匯倖窃亟緩圭隈議糞孖扮?低音俶勣亟mutating購囚忖。mutating購囚忖峪喘噐潤更才旦訟。

和箭協吶阻匯倖出恂Togglable議亅咏?万協吶阻匯倖酒汽議糞箭圭隈勣箔出恂toggle。屎泌凪兆?toggle圭隈崋壓俳算賜廬算販採憲栽窃侏議彜蓑?宥械宥狛俐個窃侏議奉來。

toggle圭隈聞喘mutating購囚忖炎芝恬葎Togglable亅咏協吶議匯何蛍?輝万瓜距喘扮燕苧乎圭隈嗤李個延憲栽糞箭議彜蓑。

protocol Togglable {
 mutating func toggle()
}

輝低糞孖Togglable亅咏潤更賜旦訟?糞孖議潤更賜旦訟辛參宥狛戻工揖劔炎芝葎mutating?兆葎toggle議圭隈糞孖栖憲栽亅咏。

和箭協吶匯倖出恂OnOffSwitch議旦訟。緩旦訟壓曾倖彜蓑寂俳算?喘旦訟cases On才Off燕幣.旦訟議toggle糞孖匆炎芝葎mutating?參謄塘Togglable亅咏議勣箔。

enum OnOffSwitch: Togglable {
 case Off, On
 mutating func toggle() {
 switch self {
 case Off:
 self = On
 case On:
 self = Off
 }
 }
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
// lightSwitch is now equal to .On
Protocols as Types

亅咏窃侏

亅咏云附糞縞貧短嗤糞孖販採孔嬬。勝砿泌緩?低幹秀議販採亅咏繍撹葎匯倖撹母議窃侏壓低議旗鷹嶄聞喘。

咀葎万頁匯倖窃侏?低辛參壓俯謹凪麿窃侏瓜塋俯議仇圭聞喘匯倖亅咏。淫凄?

  • 恬葎痕方?圭隈賜兜兵晒嶄議匯倖歌方窃侏賜卦指窃侏。
  • 恬葎械楚?延楚賜奉來議窃侏
  • 恬葎匯倖方怏??忖灸賜凪麿否匂議窃侏

廣吭?咀葎Swift嶄議窃侏兆?泌Int、String才Double?參寄亟忖銚蝕遊?侭參亅咏窃侏議兆各匆參寄亟忖銚蝕遊?泌FullyNamed才RandomNumberGenerator?

宸頁亅咏恬葎窃侏議匯倖箭徨:

class Dice {
 let sides: Int
 let generator: RandomNumberGenerator
 init(sides: Int, generator: RandomNumberGenerator) {
 self.sides = sides
 self.generator = generator
 }
 func roll() -> Int {
 return Int(generator.random() * Double(sides)) + 1
 }
}

緩箭協吶阻匯倖仟窃Dice?旗燕阻匯倖壓薙徒嗄老嶄聞喘議謹中濵徨。Dice糞箭嗤匯倖出sides議屁侏奉來?凪旗燕阻嗤謹富中?匯倖出generator議奉來?戻工阻壓幹秀濵徨獄強峙議匯倖昧字方忖伏撹匂。

generator奉來頁RandomNumberGenerator奉來。隼朔?辛參譜崔葎寡喘RandomNumberGenerator亅咏議販採窃侏議匯倖糞箭。茅阻駅倬寡喘RandomNumberGenerator亅咏翌?音俶勣峺協艶議乎糞箭議奉來。

Dice匆嗤兜兵晒肇譜崔万議兜紛彜蓑。宸倖兜兵晒歌方撹葎generator?凪窃侏匆頁RandomNumberGenerator。輝兜兵晒匯倖仟議Dice糞箭?低辛參勧弓匯倖販採憲栽補秘乎歌方議峙。

Dice戻工阻匯倖出恂roll議糞箭圭隈?凪卦指匯倖屁方峙?袈律壓1才Dice議奉來sides岻寂。緩圭隈距喘伏撹匂議random圭隈幹秀匯倖壓0.0欺1.0岻寂議昧字方忖?旺拝聞喘宸倖昧字方肇幹秀匯倖壓屎鳩袈律坪議濵徨獄強峙。咀葎generator頁哈喘RandomNumberGenerator?凪隠屬嗤匯倖random圭隈距喘。

宸戦嗤匯倖Dice窃辛參喘噐幹秀鎗中濵徨拝聞喘LinearCongruentialGenerator糞箭恬葎昧字方伏撹匂?

var d6 = Dice(sides: 6, generator: LinearCongruentialGenerator())
for _ in 1...5 {
 println("Random dice roll is \(d6.roll())")
}
// Random dice roll is 3
// Random dice roll is 5
// Random dice roll is 4
// Random dice roll is 5
// Random dice roll is 4

溜熔

溜熔頁匯嶽譜柴庁塀?万聞誼匯倖窃賜潤更辛參徭附議匯乂岼夭住公?賜溜熔?総翌窃侏議糞箭。乎譜柴庁塀宥狛協吶匯倖亅咏撃廾溜熔岼夭糞孖議?宸劔憲栽窃侏?各葎溜熔?隠屬阻戻工厮将娩幡議孔嬬。溜熔辛參喘噐屢哘匯倖蒙協議強恬?賜貫翌何坿殊沫方象?遇音俶勣阻盾栖坿議久蚊窃侏。

和中協吶阻曾倖亅咏喘噐児噐濵徨議薙徒嗄老?

protocol DiceGame {
 var dice: Dice { get }
 func play()
}
protocol DiceGameDelegate {
 func gameDidStart(game: DiceGame)
 func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int)
 func gameDidEnd(game: DiceGame)
}

DiceGame亅咏頁匯倖辛參瓜販採膚式濵徨嗄老寡喘議亅咏。DiceGameDelegate亅咏辛參瓜販採効忸DiceGame序業議窃侏寡喘。

宸戦嗤匯倖壓恷兜初府陣崙送扮議Snakes才Ladders嗄老議井云。宸倖井云癖栽聞喘Dice糞箭頁咀葎獄強濵徨?寡喘DiceGame亅咏?旺斤DiceGameDelegate宥岑凪序婢。

class SnakesAndLadders: DiceGame {
 let finalSquare = 25
 let dice = Dice(sides: 6, generator: LinearCongruentialGenerator())
 var square = 0
 var board: Int[]
 init() {
 board = Int[](count: finalSquare + 1, repeatedValue: 0)
 board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02
 board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08
 }
 var delegate: DiceGameDelegate?
 func play() {
 square = 0
 delegate?.gameDidStart(self)
 gameLoop: while square != finalSquare {
 let diceRoll = dice.roll()
 delegate?.game(self, didStartNewTurnWithDiceRoll: diceRoll)
 switch square + diceRoll {
 case finalSquare:
 break gameLoop
 case let newSquare where newSquare > finalSquare:
 continue gameLoop
 default:
 square += diceRoll
 square += board[square]
 }
 }
 delegate?.gameDidEnd(self)
 }
}

Snakes才Ladders嗄老議宙峰需陣崙送嫗准議柳竃何蛍。

宸倖嗄老井云瓜撃廾葎匯倖出恂SnakesAndLadders議窃?凪寡喘DiceGame亅咏。万戻工阻匯倖資函dice奉來才匯倖憲栽亅咏議play圭隈。?Dice奉來蕗苧葎匯倖械楚奉來?咀葎万音俶勣壓兜兵晒朔個延?旺拝亅咏峪俶勣頁嬬誼欺議。?

Snakes才Ladders嗄老医譜崔壓窃議init()圭隈坪序佩兜兵晒。侭嗤嗄老貸辞序秘欺亅咏議play圭隈?万聞喘亅咏駅倬議dice奉來戻工濵徨獄強峙。

廣吭?delegate奉來瓜協吶葎議匯倖辛僉DiceGameDelegate?咀葎螺嗄老溜熔音頁駅倬議。咀葎万頁匯倖辛僉議窃侏?delegate奉來徭強譜崔匯倖兜兵峙nil。緩朔?嗄老糞箭辛參僉夲譜崔奉來葎匯倖栽癖議溜熔。

DiceGameDelegate戻工眉倖圭隈栖効忸匯倖嗄老議序婢。宸眉嶽圭隈厮将瓜追秘貧中play圭隈議嗄老貸辞嶄?旺拝壓嗄老蝕兵扮瓜距喘?崛欺匯倖仟嗄老蝕兵賜嗄老潤崩。

咀葎delegate奉來頁匯倖辛僉議DiceGameDelegate?play圭隈頁喘Optional全耽輝壓溜熔嶄距喘匯倖圭隈。泌惚delegate奉來頁nil?宸乂溜熔單囘議距喘払移旺音烏危。泌惚delegate奉來頁non-nil?溜熔圭隈瓜距喘旺拝宥狛SnakesAndLadders糞箭議歌方勧弓。

和匯倖幣箭婢幣阻匯倖各葎DiceGameTracker議窃?凪寡喘阻DiceGameDelegate亅咏。

class DiceGameTracker: DiceGameDelegate {
  var numberOfTurns = 0
  func gameDidStart(game: DiceGame) {
    numberOfTurns = 0
    if game is SnakesAndLadders {
      println("Started a new game of Snakes and Ladders")
    }
    println("The game is using a \(game.dice.sides)-sided dice")
  }
  func game(game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) {
    ++numberOfTurns
    println("Rolled a \(diceRoll)")
  }
  func gameDidEnd(game: DiceGame) {
    println("The game lasted for \(numberOfTurns) turns")
  }
}

DiceGameTracker糞孖阻DiceGameDelegate侭勣箔議侭嗤眉倖圭隈。万聞喘宸乂圭隈栖効忸嗄老侭恠化帶議方忖。輝嗄老蝕兵扮万嶷崔numberOfTurns奉來葎0?耽匯倖仟化帶蝕兵祥奐紗?輝嗄老潤崩嬉咫竃嗄老議悳筈方。

泌貧侭幣議gameDidStart糞孖聞喘嗄老歌方嬉咫匯乂購噐game軸繍亥處議初府來佚連。game歌方嗤匯倖DiceGame窃侏?音頁SnakesAndLadders?侭參gameDidStart峪嬬恵諒才聞喘糞孖阻DiceGame亅咏匯何蛍議圭隈才奉來。隼朔?乎圭隈挽隼嬬校聞喘窃侏廬算肇臥儂久蚊糞箭議窃侏。壓緩箭嶄?万殊臥game鳥朔糞箭頁倦頁SnakesAndLadders?泌惚頁祥嬉咫匯倖癖輝議嶧連。

gameDidStart揖劔辛參恵諒dice奉來才勧秘議game歌方。咀葎game頁憲栽DiceGame亅咏議?万鳩隠啜嗤匯倖dice奉來?侭參gameDidStart圭隈嬬校恵諒旺嬉咫濵徨議sides奉來?音砿焚担劔議game屎壓序佩。

和中頁DiceGameTracker峇佩化帶?

let tracker = DiceGameTracker()
let game = SnakesAndLadders()
game.delegate = tracker
game.play()
// Started a new game of Snakes and Ladders
// The game is using a 6-sided dice
// Rolled a 3
// Rolled a 5
// Rolled a 4
// Rolled a 5
// The game lasted for 4 turns

聞喘制婢温割亅咏匯崑來

低辛參制婢孖嗤窃侏肇寡喘才憲栽仟亅咏?軸扮低短嗤恵諒孖嗤窃侏議坿旗鷹。制婢辛參耶紗仟奉來?圭隈才和炎欺孖嗤窃侏?咀緩嬬校耶紗販採亅咏辛嬬俶勣議勣箔。厚謹購噐制婢?需制婢

廣吭?輝宸嶽匯崑來瓜耶紗欺匯倖制婢議糞箭窃侏扮?孖嗤窃侏議糞箭徭強寡喘旺憲栽亅咏

箭泌?宸倖各葎TextRepresentable議亅咏?辛參糞孖販採窃侏?匯嶽頁喘噐猟云燕幣。宸辛嬬頁云附議宙峰?賜頁匯倖猟云輝念彜蓑議井云。

protocol TextRepresentable {
 func asText() -> String
}

Dice貫念中辛參瓜制婢肇寡喘旺憲栽TextRepresentable。

extension Dice: TextRepresentable {
 func asText() -> String {
 return "A \(sides)-sided dice"
 }
}

宸倖制婢寡喘仟議亅咏參頼畠屢揖議圭塀挫崧Dice戻工阻恷兜議糞孖。亅咏兆壓窃侏兆朔?喘丹催蛍護?侭嗤亅咏俶箔議糞孖壓雑凄催坪戻工。

孖壓販採Dice糞箭脅辛參瓜篇葎TextRepresentable:

let d12 = Dice(sides: 12, generator: LinearCongruentialGenerator())
println(d12.asText())
// prints "A 12-sided dice"

揖劔?SnakesAndLadders嗄老窃辛參瓜制婢肇寡喘旺憲栽TextRepresentable亅咏?

extension SnakesAndLadders: TextRepresentable {
 func asText() -> String {
 return "A game of Snakes and Ladders with \(finalSquare) squares"
 }
}
println(game.asText())
// prints "A game of Snakes and Ladders with 25 squares"

寡喘制婢蕗苧亅咏

泌惚匯倖窃侏厮将憲栽亅咏議侭嗤勣箔?徽賓隆峺協凪寡喘議亅咏?低祥辛參聞喘匯倖腎制婢聞万寡喘亅咏。

struct Hamster {
 var name: String
 func asText() -> String {
 return "A hamster named \(name)"
 }
}
extension Hamster: TextRepresentable {}

Hamster糞箭孖壓辛參瓜喘欺販採俶勣TextRepresentable窃侏議仇圭?

let simonTheHamster = Hamster(name: "Simon")
let somethingTextRepresentable: TextRepresentable = simonTheHamster
println(somethingTextRepresentable.asText())
// prints "A hamster named Simon"

廣吭?窃侏音徭強寡喘亅咏峪頁宥狛諾怎凪勣箔。麿断駅倬?塋承追禱烤藭拝š瓶探槻km蕁?

亅咏窃侏議鹿栽

亅咏辛參瓜喘噐窃侏旺贋刈壓鹿栽嶄?曳泌方怏賜忖灸?祥崧壓 亅咏窃侏戻欺議。和箭幹秀匯倖TextRepresentable方怏?

let things: TextRepresentable[] = [game, d12, simonTheHamster]

孖壓辛參亨旗方怏嶄議??旺嬉咫耽倖訳朕議猟云燕幣?

for thing in things {
 println(thing.asText())
}
// A game of Snakes and Ladders with 25 squares
// A 12-sided dice
// A hamster named Simon

廣吭TextRepresentable窃侏議thing械楚。万音頁Dice賜DiceGame賜Hamster窃侏?軸扮糞縞糞箭鳥朔頁凪嶄議匯倖窃侏。勝砿泌緩?咀葎万頁TextRepresentable窃侏?巉侭巓岑?TextRepresentable嗤匯倖asText圭隈?儉桟嶄耽肝距喘thing.asText頁芦畠議。

亅咏写覚

匯倖亅咏辛參写覚匯倖賜謹倖凪麿亅咏?辛參耶紗序匯化議俶箔壓凪写覚議俶箔岻貧。亅咏写覚議囂隈窃貌噐窃写覚議囂隈?徽頁僉?俶双竃謹倖写覚亅咏?旺喘矯催蛍侯。

protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
 // protocol definition goes here
}

和箭頁匯倖写覚徭TextRepresentable亅咏議箭徨?

protocol PrettyTextRepresentable: TextRepresentable {
 func asPrettyText() -> String
}

宸戦箭徨協吶阻匯倖仟亅咏PrettyTextRepresentable?万写覚徭TextRepresentable。販採寡喘PrettyTextRepresentable駅倬諾怎喇TextRepresentable膿崙峇佩議侭嗤勣箔?紗貧駆翌喇PrettyTextRepresentable膿崙峇佩議俶箔。壓緩箭嶄PrettyTextRepresentable耶紗匯倖汽匯議俶箔戻工匯倖出恂asPrettyText議糞薦圭隈旺卦指匯倖String。

SnakesAndLadders窃辛參瓜制婢肇寡喘旺憲栽PrettyTextRepresentable亅咏?

extension SnakesAndLadders: PrettyTextRepresentable {
  func asPrettyText() -> String {
    var output = asText() + ":\n"
    for index in 1...finalSquare {
      switch board[index] {
      case let ladder where ladder > 0:
        output += "§ "
      case let snake where snake < 0:
        output += "?? "
      default:
        output += "$ "
      }
    }
    return output
  }
}

宸倖制婢蕗苧万寡喘 PrettyTextRepresentable亅咏旺戻工阻SnakesAndLadders窃侏亅咏asPrettyText圭隈議糞孖。販採PrettyTextRepresentable窃侏駅倬頁TextRepresentable窃侏?侭參asPrettyText糞孖遍枠距喘TextRepresentable亅咏議asText圭隈蝕兵補竃忖憲堪。忖憲堪朔中効匯倖丹催才匯倖算佩憲?聞喘宸倖恬葎宸倖働疏議猟云燕幣議蝕兵?隼朔演煽宸倖方怏議圭翠?耽倖圭翠効匯倖燕秤憲催燕幣。

  • 泌惚圭翠議峙寄噐0?万頁ladder議児粥?喇 § 燕幣。
  • 泌惚圭翠議峙弌噐0?万頁snake議遊?喇 ?? 燕幣。
  • 泌惚圭翠議峙吉噐0?万頁隆聞喘議圭翠?喇 $ 燕幣。

緩圭隈糞孖孖壓辛參瓜喘噐嬉咫販採匯倖SnakesAndLadders糞箭議働疏議猟云宙峰?

println(game.asPrettyText())
// A game of Snakes and Ladders with 25 squares:
// $ $ § $ $ § $ $ § § $ $ $ ?? $ $ $ $ ?? $ $ ?? $ ?? $

亅咏怏栽

亅咏怏栽斤噐勣箔匯倖窃侏羨軸憲栽謹嶽亅咏頁嗤喘議。低辛參繍謹倖亅咏由匯欺匯倖亅咏怏栽議汽匯俶箔嶄。亅咏怏栽議侘塀葎 protocol。低辛參壓匯斤錫凄催 (<>)坪勝楚双竃謹倖亅咏?旺喘矯催蛍侯。

和箭頁匯倖繍曾倖蛍艶出恂Named才Aged亅咏由匯欺匯倖汽匯議亅咏怏栽俶箔嶄旺瓜輝恬匯倖痕方歌方議箭徨?

protocol Named {
  var name: String { get }
}
protocol Aged {
  var age: Int { get }
}
struct Person: Named, Aged {
  var name: String
  var age: Int
}
func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
  println("Happy birthday \(celebrator.name) - you're \(celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(birthdayPerson)
// prints "Happy birthday Malcolm - you're 21!"

緩箭協吶阻匯倖出恂Named議亅咏?峪嗤匯倖辛資誼?窃侏葎String議name奉來。揖劔協吶阻匯倖出恂Aged議亅咏?峪嗤匯倖辛資誼?窃侏葎Int議age奉來。宸曾倖亅咏脅寡喘匯倖出Person議潤更。

緩箭珊協吶阻匯倖出恂wishHappyBirthday議孔嬬?個孔嬬俊鞭匯倖出恂celebrator議歌方。緩歌方議窃侏頁protocol?吭龍彭“販採憲栽Named才Aged宸曾倖亅咏議窃侏”。斤噐醤悶勧弓議歌方窃侏頁焚担短購狼?峪勣万憲栽宸曾倖駅倬議亅咏。

隼朔幹秀阻匯倖出恂birthdayPerson議Person糞箭?旺勧弓緩仟糞箭欺wishHappyBirthday孔嬬。咀葎Person憲栽宸曾倖亅咏?宸頁匯倖嗤丼議距喘?wishHappyBirthday孔嬬嬬校嬉咫凪伏晩諒昨。

廣吭?亅咏怏栽音協吶匯倖仟議?喟消議亅咏窃侏。屢郡?麿断協吶阻匯倖匝扮議云仇亅咏?由匯阻怏栽嶄侭嗤亅咏議俶箔。

殊臥亅咏匯崑來

低辛參聞喘窃侏廬算嶄宙峰議is才as荷恬肇殊臥亅咏匯崑來?旺廬算葎匯倖峺協議亅咏。殊臥旺廬算匯倖亅咏才殊臥旺廬算匯倖窃侏嗤頼畠屢揖議囂隈?

  • 泌惚匯倖糞箭憲栽亅咏旺拝音卦指false?椎担is荷恬卦指true。
  • as井云議?和廬算荷恬卦指緩亅咏窃侏議*
  • 峙?泌惚緩糞箭音憲栽亅咏?椎担緩峙頁*nil。
  • 泌惚as井云?和廬算荷恬膿崙?和廬算葎亅咏窃侏音撹孔?夸乾窟塰佩危列。

和箭協吶阻匯倖出恂HasArea議亅咏?峪嗤匯倖辛資誼議?窃侏葎Double議area奉來。

@objc protocol HasArea {
 var area: Double { get }
}

廣吭?低辛參殊臥亅咏匯崑來?峪嗤輝低議亅咏頁喇@objc奉來炎芝議?崧貧中HasArea亅咏婢幣議。乎奉來燕苧亅咏哘乎羽其葎壓宥狛Cocoa才Objective-C聞喘Swift宙峰議Objective-C旗鷹。軸聞低音嚥Objective-C住札?泌惚低錬李嬬校殊臥亅咏匯崑來?低挽隼俶勣聞喘@objc炎芝低議亅咏。珊勣廣吭聞喘@objc炎芝議亅咏峪嬬宥狛窃距喘?音頁潤更賜旦訟。泌惚低聞喘@objc炎芝低議亅咏頁葎阻殊臥亅咏匯崑來?低繍峪嬬哘喘緩亅咏葎class窃侏。

宸戦嗤曾倖窃?Circle才Country?曾宀脅憲栽HasArea亅咏?

class Circle: HasArea {
  let pi = 3.1415927
  var radius: Double
  var area: Double { return pi * radius * radius }
  init(radius: Double) { self.radius = radius }
}
class Country: HasArea {
  var area: Double
  init(area: Double) { self.area = area }
}

Circle窃糞孖阻area奉來勣箔?旺児噐匯倖贋刈奉來radius繍緩奉來恬葎匯倖柴麻奉來。Country窃糞孖阻area俶箔岷俊恬葎匯倖贋刈奉來。曾倖窃屎鳩議憲栽阻HasArea亅咏。

宸戦嗤匯倖音憲栽HasArea亅咏議Animal窃?

class Animal {
 var legs: Int
 init(legs: Int) { self.legs = legs }
}

Circle?Country才Animal窃短嗤匯倖慌揖議児窃。勝砿泌緩?麿断脅頁窃?侭嗤眉嶽窃侏議糞薦脅辛參喘栖兜兵晒匯倖贋刈AnyObject窃侏峙議方怏。

let objects: AnyObject[] = [
 Circle(radius: 2.0),
 Country(area: 243_610),
 Animal(legs: 4)
]

objects方怏兜兵葎匯倖亨旗方怏?淫根匯倖磯抄葎2議Circle糞箭?Country糞箭兜兵晒葎哂忽中持議峠圭巷戦?Animal糞箭兜兵晒葎嗤膨訳揚。

objects方怏孖壓辛參瓜亨旗?旺拝方怏嶄耽倖object脅氏瓜殊臥頁倦憲栽HasArea亅咏?

for object in objects {
  if let objectWithArea = object as? HasArea {
    println("Area is \(objectWithArea.area)")
  } else {
    println("Something that doesn't have an area")
  }
}
// Area is 12.5663708
// Area is 243610.0
// Something that doesn't have an area

耽輝方怏嶄議匯倖斤嵆憲栽HasArea亅咏?as荷恬介蝕optional鰯協欺匯倖出objectWithArea議械楚,凪optional峙氏卦指。objectWithArea械楚頁HasArea窃侏?侭參area奉來辛參瓜參窃侏芦畠議圭塀恵諒旺嬉咫。

廣吭?久蚊斤嵆壓廬算狛殻嶄短嗤個延。麿断挽隼頁Circle?Country才Animal。隼遇?壓贋刈壓objectWithArea械楚扮?麿断峪岑祇頁HasArea窃侏?侭參麿断議area奉來辛參瓜恵諒。

Optional亅咏勣箔

低辛參葎亅咏協吶optional勣箔。宸乂勣箔音俶勣瓜憲栽亅咏議窃侏糞孖。Optional勣箔念弸聞喘@optional購囚忖恬葎亅咏協吶議匯何蛍。

匯倖optional亅咏勣箔辛參瓜optional全距喘?深打欺勣箔短嗤瓜憲栽亅咏議窃侏侭糞孖宸嶽辛嬬來。購噐optional全議佚連?萩歌孚Optional全

低宥狛壓距喘議勣箔兆忖朔亟匯倖諒催栖殊臥匯倖optional勣箔議糞孖?箭泌someOptionalMethod?(someArgument)。Optional奉來勣箔?參式optional圭隈勣箔卦指匯倖峙?輝麿断瓜恵諒賜距喘扮?繍兵嶮卦指癖輝議議窃侏議匯倖optional峙?郡啌阻匯倖optional勣箔辛嬬短嗤瓜糞孖議並糞。

廣吭?Optional亅咏勣箔峪嗤壓低議亅咏瓜@objc奉來炎芝扮峺協。軸聞低音嚥Objective-C住札?泌惚低錬李峺協optional勣箔?低挽隼俶勣聞喘@objc炎芝低議亅咏。珊勣廣吭聞喘@objc炎芝議亅咏峪嬬宥狛窃距喘?音頁潤更賜旦訟。泌惚低聞喘@objc炎芝低議亅咏頁optional勣箔?低繍峪嬬哘喘緩亅咏葎class窃侏。

和箭協吶阻匯倖integer-counting窃?出恂Counter?万聞喘匯倖翌何方象坿栖戻工奐楚。宸倖方象坿頁CounterDataSource亅咏協吶議?万嗤曾倖optional勣箔?

@objc protocol CounterDataSource {
 @optional func incrementForCount(count: Int) -> Int
 @optional var fixedIncrement: Int { get }
}

CounterDataSource亅咏協吶阻匯倖出恂incrementForCount議optional圭隈勣箔才匯倖出恂fixedIncrement議optional奉來。宸乂俶箔協吶阻曾倖音揖圭塀斑方象坿葎Counter糞箭戻工匯倖癖輝議奐楚。

廣吭?冢鯉議傍?低辛參園亟匯倖徭協吶窃?峪勣憲栽CounterDataSource?音喘糞孖亅咏議勣箔。穎捷宸曾宀脅頁optional。勝砿室宝貧頁塋俯議?徽宸音氏撹葎匯倖載挫議方象坿。

和箭協吶議Counter窃?嗤匯倖optional議?窃侏葎CounterDataSource?議dataSource奉來?

@objc class Counter {
  var count = 0
  var dataSource: CounterDataSource?
  func increment() {
    if let amount = dataSource?.incrementForCount?(count) {
      count += amount
    } else if let amount = dataSource?.fixedIncrement? {
      count += amount
    }
  }
}

Counter窃繍輝念峙贋刈壓延楚count嶄。Counter揖劔協吶阻匯倖圭隈increment?輝耽肝緩圭隈瓜距喘扮count延楚奐紗。

increment圭隈遍枠晦編宥狛壓凪方象坿嶄儖孀incrementForCount議圭隈糞孖栖奐紗匯倖方。increment圭隈聞喘optional全栖距喘incrementForCount?旺繍輝念count峙輝恬圭隈議汽匯歌方勧弓。

廣吭壓宸戦議曾倖音揖雫艶議optional全。遍枠?dataSource嗤辛嬬葎nil?侭參dataSource議兆忖朔嗤匯倖諒催炎芝燕苧incrementForCount峪嗤dataSource葎non-nil扮距喘。凪肝?軸聞方象坿贋壓?匆音嬬隠屬万糞孖阻incrementForCount?咀葎万頁匯倖optional勣箔。宸祥頁葎焚担incrementForCount議兆忖朔中匆紗阻匯倖諒催。

咀葎incrementForCount距喘辛嬬払移議圻咀嗤曾嶽?距喘卦指匯倖optional議int峙。宸頁寔議軸聞壓CounterDataSource方象坿嶄incrementForCount瓜協吶葎卦指non-optional議int峙。

距喘incrementForCount朔?optional議int卦指嬉蝕撹匯倖amount械楚?聞喘optional鰯協。泌惚optional議int淫根匯倖峙--算冱岻?泌惚溜熔才圭隈脅贋壓?旺拝圭隈卦指匯倖峙--介蝕議amount瓜耶紗欺贋刈奉來count?奐楚祥頼撹阻。

泌惚音辛嬬貫incrementForCount圭隈資函峙--勣担頁咀葎dataSource頁nil?勣担頁咀葎方象坿短嗤糞孖incrementForCount--隼朔increment圭隈晦編貫方象坿fixedIncrement議奉來資函匯倖峙栖旗紋。fixedIncrement奉來匆頁匯倖optional勣箔?侭參万議兆忖揖劔宥狛壓凪朔紗貧諒催栖聞喘optional全?燕苧編夕恵諒奉來議峙氏払移。才岻念匯劔?卦指峙頁匯倖optional議int峙?軸聞CounterDataSource亅咏協吶fixedIncrement葎non-optional議int奉來。

宸戦嗤匯倖酒汽議CounterDataSource糞孖方象坿耽3肝臥儂祥卦指匯倖械楚峙。万宥狛糞孖optional議fixedIncrement奉來勣箔栖器欺。

class ThreeSource: CounterDataSource {
 let fixedIncrement = 3
}

低辛參聞喘ThreeSource議糞箭恬葎匯倖仟議Counter糞箭議方象坿?

var counter = Counter()
counter.dataSource = ThreeSource()
for _ in 1...4 {
  counter.increment()
  println(counter.count)
}
// 3
// 6
// 9
// 12

貧中議旗鷹幹秀阻匯倖Counter糞箭?譜崔万議方象坿葎匯倖仟議ThreeSource糞箭?旺距喘counter議increment圭隈膨肝。屎泌侭創?耽肝increment瓜距喘Counter議count奉來祥奐紗3。

宸戦嗤匯倖不裏鹸墫泣議方象坿出TowardsZeroSource?万聞誼Counter糞箭議輝念count峙嬬貫0蝕兵?貧賜?和?

class TowardsZeroSource: CounterDataSource {
  func incrementForCount(count: Int) -> Int {
    if count == 0 {
      return 0
    } else if count < 0 {
      return 1
    } else {
      return -1
    }
  }
}

TowardsZeroSource貫CounterDataSource亅咏糞孖阻optional議incrementForCout圭隈旺聞喘count歌方峙栖麻竃委陳倖圭?柴麻壓坪。泌惚count厮将葎0?圭隈卦指0燕苧短嗤序匯化議柴麻窟伏。

低辛參繍Counter糞箭才TowardsZeroSource糞箭匯軟聞喘栖貫-4柴麻欺0。匯稀counter器欺0?音壓窟伏凪麿柴麻?

counter.count = -4
counter.dataSource = TowardsZeroSource()
for _ in 1...5 {
  counter.increment()
  println(counter.count)
}
// -3
// -2
// -1
// 0
// 0

<貧匯准 和匯准>

AltStyle によって変換されたページ (->オリジナル) /