stride
λ μ
μ μλ λ²μλ₯Ό μ§μ ν΄μ£Ό λ λ©μλμ΄λ€.
μ΄κ±Έ μ΄μ©νλ©΄ μμμ κ°μ λΆλμμμ λ μ μκ° μλ€.
for i in stride(from: 0.5, throught: 15.25, by: 0.3) {
}
ννμ λ©μλλ λ³μκ° μλ μν ꡬ쑰체
μ΄λ€.
κ°λ§ μλ ννμ λ§€μ° κ°λ²Όμ΄ κ΅¬μ‘°μ²΄λ‘ μμμ μ΄λ¦μ μ μ°νκ² μ€μ ν μ μλ€.
let x: (String, Int, Double) = ("hello", 5, 0.85)
let (word, number, value) = x
print(word) // print "hello"
print(number) // print 5
print(value) // print 0.85
let x: (w: String, i: Int, v: Double) = ("hello", 5, 0.85)
print(x.w) // print "hello"
print(x.i) // print 5
print(x.v) // print 0.85
let (wrd, num, val) = x
κ°μ μ΄λμ μ μ₯νμ§ μκ³ κ³μ°λ ννλ‘ μ¬μ©ν μ μλ€.
λ€λ₯Έ μΈμ΄μμ νν 보μ΄λ get setμ μ¬μ©νλλ°,
getμμ΄ setλ§ μμ μλ μλ€. κ·Έλ¬λ©΄ ν¨μλ₯Ό λ§λλ νΈμ΄ λ«λ€.
getμ κ°μ μ»κ³ μ νλ κ²½μ°μ μ¬μ©νλ€. λ°λΌμ get μμμλ κ°μ 리ν΄ν΄μ£Όλ©΄ λλ€. setμμ΄ getλ§ μ¬μ©ν λλ κ΅³μ΄ getμ μ¬μ©ν΄μ£Όμ§ μμλ λλ€.
// lazy var game = Concentration(numberOfPairsOfCards: (cardButtons.count+1)/2)
lazy var game = Concentration(numberOfPairsOfCards: numberOfPairsOfCards)
var numberOfPairsOfCards: Int {
return (cardButtons.count+1) / 2
}
setμμ newValueλ μλ΅ν΄μ€ μ μλ€. μ νμ©νλ©΄ μ½λλ₯Ό κ°κ²°νκ³ μ§κ΄μ μ΄κ² λ§λ€μ΄μ€λ€.
var indexOfOneAndOnlyFaceUpCard: Int?
func chooseCard(at index: Int) {
if let matchIndex = indexOfOneAndOnlyFaceUpCard, matchIndex != index {
if cards[matchIndex].identifire == cards[index].identifire {
cards[matchIndex].isMatched = true
cards[index].isMatched = true
}
cards[index].isFaceUp = true
indexOfOneAndOnlyFaceUpCard = nil
} else {
for downFlipIndex in cards.indices {
cards[downFlipIndex].isFaceUp = false
}
cards[index].isFaceUp = true
indexOfOneAndOnlyFaceUpCard = index
}
}
μ΄ μ½λλ₯Ό μ΄λ κ² κ°μ ν΄μ€ μ μλ€. μ΄λ κ² computed Propertyλ₯Ό μ¬μ©ν¨μΌλ‘μ¨ chooseCardμμλ μ§μ§ μΉ΄λλ₯Ό μ ννλ μΌμλ§ μ§μ€ν μ μκ²λλ€.
var indexOfOneAndOnlyFaceUpCard: Int? {
get {
var foundIndex: Int?
for index in cards.indicies {
if cards[index].isFaceUp {
if indexOfOneAndOnlyFaceUpCard == nil {
foundIndex = index
} else {
return nil
}
}
}
return foundIndex
}
set {
for index in cards.indicies {
cards[index].isFaceUp = (index == newValue)
}
}
}
func chooseCard(at index: Int) {
if let matchIndex = indexOfOneAndOnlyFaceUpCard, matchIndex != index {
if cards[matchIndex].identifire == cards[index].identifire {
cards[matchIndex].isMatched = true
cards[index].isMatched = true
}
cards[index].isFaceUp = true
//indexOfOneAndOnlyFaceUpCard = nil
} else {
/*
for downFlipIndex in cards.indices {
cards[downFlipIndex].isFa0ceUp = false
}
cards[index].isFaceUp = true
*/
indexOfOneAndOnlyFaceUpCard = index
}
}
μ κ·Όμ μ΄μλ λ³μλ ν¨μ, ν΄λμ€ κ΅¬μ‘°μ²΄ λ± μμ λΆμ¬μ μ κ·Όμ μ νν μ μλ€.
κΈ°λ³Έκ°μΌλ‘ λ°λ‘ μ κ·Όμ μ΄μλ₯Ό μ€μ νμ§ μλλ€λ©΄ internalμ΄ κΈ°λ³Έκ°μΌλ‘ λ€μ΄κ°λ€. internalμ μ±μ΄λ νλ μμν¬μ λͺ¨λ μμκ° μ κ·Όκ°λ₯ν μ½λμ΄λ€.
μΈλΆμμ μ½κ³ μ°λ κ²μ μ°¨λ¨νλ€.
μΈλΆμμ μ½λ κ²μ κ°λ₯νμ§λ§ μμ μ μ°¨λ¨νλ€.
νμΌ μμμλ μμ λ‘κ² μ½κ³ μΈ μ μλ€.
μΈλΆμμ μ½μ μ μμ§λ§ μμ μ μ°¨λ¨νλ€
μΈλΆμμ μ½κ³ μ°λ κ²μ μμ κ°λ°©νλ€.
assert(쑰건문, κ²½κ³ λ©μΈμ§) μ κ°μ μμΌλ‘ μ¬μ©νλ€.
μ‘°κ±΄λ¬Έμ΄ μλ κ²½μ° μλ¬λ₯Ό λ°μμν€κ³ κ²½κ³ λ©μΈμ§λ₯Ό μΆλ ₯νλ€.
assert(cards.indicies.contains(index)), "Concentration.chooseCard(at: \(index)): chosen index not in the cards")
extensionμ μ΄μ©ν΄ λ³μμ ν¨μλ₯Ό λ€λ₯Έ ν΄λμ€μ μΆκ°ν μ μλ€.
κ°μ μ μ₯ν μ μλ€. κΈ°μ‘΄ κ²μ νμ₯νλ ννμ΄κΈ° λλ¬Έμ μ μ₯νλ λ³μλ λ μ μλ€.
ν΄λΉ ν΄λμ€μ μ΄μΈλ¦¬μ§ μλ λ³μλ ν¨μλ₯Ό μΆκ°νμ§ μλλ‘ μ£Όμνλ€.
extension Int {
var arc4random: Int {
return arc4random_uniform
}
}
μ°κ΄λ κ°μ λ¬Άμ΄μ μ μν μ μλ€. ꡬ쑰체λ ν΄λμ€μ κ°μ΄ νλμ νμ μ΄λ€.
enum FastFoodItem {
case hamburger
case fries
case drink
case cookie
}
enumμ νμλ μλμ§λ§ μνλ κ²½μ°μ μ°κ΄κ°μ κ°μ§ μ μλλ°, ννκ³Ό μ μ¬νλ€
enum FastFoodItem {
case hamburger(numberOfPatties: Int)
case fries(size: FryOrderSize)
case drink(String, ounces: Int)
case cookie
}
enumμ ꡬ쑰체μ λ§μ°¬κ°μ§λ‘ μ μ₯ κ°μ κ°μ§ μ μμ§λ§ λ³μλ λ©μλλ κ°μ§ μ μλ€. switchλ₯Ό μ¬μ©ν΄ μ μν΄λ μ°κ΄κ° λν μ¬μ©ν μ μλ€. fires, cookiesμ²λΌ ,
λ‘ λ¬Άμ΄μ μ¬μ©ν μλ μκ³ _
λ₯Ό μ¬μ©ν΄ μλ΅ν μλ μλ€.
enum FastFoodItem {
...
func isIncludedInSpecialOrder(number: Int) -> Bool {
switch self {
case .hamburger(let patteyCount): return patteyCount == number
case .fires, .cookies: return true
case .drink(_, let ounces): return ounces == 16
}
}
case hamburger(numberOfPatties: Int)
case fries(size: FryOrderSize)
case drink(String, ounces: Int)
case cookie
}
enumμ κ°μ λ³κ²½ν μλ μλλ°, ꡬ쑰체λ enumμ λ΄λΆ μνλ₯Ό λ³κ²½ν λλ λ°λμ mutating
μ λΆμ¬μ€μΌ νλ€.
enumκ³Ό ꡬ쑰체 κ°μ value typeμ μ°κΈ°λ₯Ό ν λ 볡μ κ° μΌμ΄λλ€. μ°κΈ°λ₯Ό μ€ννκΈ° μ μλ 볡μ κ° μΌμ΄λμ§ μκΈ° λλ¬Έμ μ΄λ€ ν¨μκ° μ°κΈ°λ₯Ό μνλμ§ μλ €μ€μΌνλ€. μ΄λ₯Ό μλ €μ£Όλκ² mutating
μ΄λ€.
μ΅μ λμ enumμΌλ‘ κ°λ μ μλμ κ°μ΄ λ³Ό μ μλ€.
enum Optional<T> {
case none
case some(<T>)
}
var hello: String? var hello: Optional<String> = .none
var hello: String? = "hello" var hello: Optional<String> = .some("hello")
var hello: String? = nil var hello: Optional<String> = .none
λ§€λ² switchλ₯Ό μ¬μ©νλ©΄ μ½λκ° κΈΈμ΄μ§κΈ° λλ¬Έμ if let
, guard
, ??
, !
λ± λ€μν λ°©λ²μ μ 곡νλ€.
/* κ°μ μΈλν μ¬μ©μ */
let hello: String? = ...
print(hello!)
// κ°μ΄ μλ€λ©΄ ν¬λμ
switch hello {
case .none: // raise an exception (crash)
case .some(let data): print(data)
}
/* guard */
if let greeting = hello {
print(greeting)
} else {
// do something
}
// κ°μ΄ μμ λ κ²½μ° μ²λ¦¬
switch hello {
case .some(let data): print(data)
case .none: { /* do something */ }
}
μ΅μ λ 체μ΄λμ΄λ κ°λ μ μλμ κ°μ λ°©μμ΄λ€, μ€κ°μ μ΄λ νλλΌλ nil κ°μ΄ μλ€λ©΄ nilμ΄ λλ€.
/* Optional Chaining */
let x: String? = ...
let y = x?.foo()?.bar?.z
switch x {
case .none: y = nil
case .some(let data1):
switch data1.foo() {
case .none: y = nil
case .some(let data2):
switch data2.bar {
case .none: y = nil
case .some(let data3): y = data3.z
}
}
}
Swiftμμ μμμΌ ν νμ μλ£κ΅¬μ‘° 4κ°μ§
- class
- struct
- enum
- protocol
ν΄λμ€λ κ°μ²΄μ§ν₯ λμμΈμ μ§μνλ€.
κΈ°λ₯κ³Ό λ°μ΄ν° λͺ¨λμκ² λ¨μΌ μμμ μ§λλ€. μ¦, λ°μ΄ν°λ₯Ό μμ
Reference Type (ν΄λμ€λ νμ μ μ₯λκ³ ν¬μΈν°λ₯Ό μ λ¬νλ€)
λ νΌλ°μ€ νμ μ ν λ΄μ μ‘΄μ¬νκ² λλλ° μΈμ μ΄λ»κ² μ¬λΌμ§κΉ? μ΄λ₯Ό μν΄μ Swiftμμλ ARC λ°©μμ μ¬μ©νλ€. Swiftλ ν λ΄μ μ°Έμ‘° μΉ΄μ΄νΈλ₯Ό λ§λ€ λλ§λ€ Swiftλ μ΄λκ°μ μλ μΉ΄μ΄ν°μ 1μ λνλ€. κ·Έλ¦¬κ³ κ°λ¦¬ν€λ κ²μ΄ μμ΄μ§κ±°λ λ μ΄μ κ°λ¦¬ν€μ§ μκ² λμμ λ nilλ‘ μ€μ λκ³ μΉ΄μ΄νΈκ° 1 μ€μ΄λ€κ² λλ€. κ·Έλμ μΉ΄μ΄νΈκ° 0μ΄ λλ©΄ νμμ μ κ±°νλ€. κ°λΉμ§ μ½λ μ μ²λΌ νμ μ μ«κ±°λ λ§νΉν΄μ μΈμ΄λ²λ¦¬λκ² μλλΌ λ μ΄μ κ°λ¦¬ν€λ ν¬μΈν°κ° μλ μ¦μ μμ νλ λ°©μμ΄λ€.
reference typeμ μ§μ ν΄μ€μΌλ‘μ¨ ARC λ°©μμ μν₯μ μ€ μ μλ€.
- strong
- weak
- unowned
strong
μ κΈ°λ³Έκ°μΌλ‘ νλ²ν μ°Έμ‘° λ°©μμ΄λ€. λ§μ½ μ΄λ€ ν¬μΈν°κ° strongμ΄λΌλ©΄ ν¬μΈν°κ° κ°λ¦¬ν€κ³ μλ ν ν λ΄μ κ³μ λκ²λλ€.
weak
μ μλκ° λνν
κ΄μ¬μ΄ μμ λλ§ κ΄μ¬μ κ°λλ€.
ν λ΄μ μλ μ΄λ€ κ²μ κ°λ¦¬ν€κ³ μμ§λ§, λλ‘μΈν΄ κ°λ¦¬ν€λ λμμ ν λ΄μ λμ§ μλλ€.
λͺ¨λ strong ν¬μΈν°κ° μ¬λΌμ§λ©΄ nilμ λ°μμ νμμ μ κ±°νλ€. λ°λΌμ weakλ μ΅μ λ ν¬μΈν°μ΄λ€.
λνμ μΌλ‘ oultetμ΄λ delegateμμ λ§μ΄ μ¬μ©λλ€.
μ°Έμ‘°νμ§ μλλ€λ μλ―Έμ΄λ€. λ§μ½ ν λ΄μ μ΄λ€ κ²μ κ°λ¦¬ν€κ³ μμ λ strong ν¬μΈν°λ‘ μΈμνμ§ μκ³ νμμ μ¬λΌμ‘μ λ μ κ·Όνμ§ μλ κ²μ μλ―Ένλ€.
λ©λͺ¨λ¦¬ μ¬μ΄ν΄μ νΌνκΈ° μν΄ μ¬μ©νλ€.
μ£Όλ‘ ν΄λ‘μ μμ λ§μ΄ μ¬μ©λλ€.
λ©λͺ¨λ¦¬ μ¬μ΄ν΄μ΄λ ν λ΄μ μ΄λ€ κ²μ΄ ν λ΄μ λ€λ₯Έ μ΄λ€ κ²μ κ°λ¦¬ν€κ³ κ·Έκ² λ€μ κ°λ¦¬ν€λ κ²μ μλ―Ένλ€. μλ‘ κ°λ¦¬ν€λ©΄μ ν λ΄μ μ μ§λμ§λ§ μλ‘λ₯Ό κ°λ¦¬ν€λ κ²μ μ μΈνκ³ λ μ무κ²λ κ°λ¦¬ν€μ§ μμμ μΈλͺ¨μλ λ©λͺ¨λ¦¬ λλΉλ₯Ό μ΄λνλ€.
value νμ μ΄κΈ° λλ¬Έμ ν λ΄μ μ‘΄μ¬νμ§ μκ³ λ³΅μ λλ€.
"copy on write" λ°©μμΈλ° μ΄λ₯Ό μ¬μ©νκΈ° μν΄μλ mutating
ν€μλκ° νμνλ€.
μμμ΄ μλ€.
value νμ , μ°κ΄ κ°μ κ°μ§ μ μμΌλ©°
funtional inheritance (κΈ°λ₯ μμ)μ κ°μ§ μ μλ€.
κΈ°λ₯ μμμ΄λ protocolμ ν΅ν΄ μ΄λ£¨μ΄μ§λ€.