π func ν¨μλͺ
(μ λ¬μΈμ λ μ΄λΈ 맀κ°λ³μ λ μ΄λΈ: 맀κ°λ³μ νμ
)
γγπ func hello(to num: Int) { ~ }
γγπ func hello(_ str: String) -> String { ~ }
π μ λ¬μΈμ λ μ΄λΈ : ν¨μ μΈλΆμμ 맀κ°λ³μμ μν μ μ’ λ λͺ
νν νλ μν , λ€λ₯΄κ² λ μ΄λΈμ μ¨μ€μΌλ‘μ¨ μ€λ²λ‘λ© κ°λ₯
π 맀κ°λ³μ : ν¨μλ₯Ό μ μν λ μΈλΆλ‘λΆν° μ λ¬λ κ°μ μ΄λ¦, ν¨μ λ΄λΆμμ μ λ¬λ κ°μ λ€λ£¨κΈ° μν μν
π _ : μμΌλ μΉ΄λ ν¨ν΄, λ³μλ₯Ό μ¬μ©ν νμκ° μμ λ μ¬μ©, 곡λ λμ μ
λ ₯st
π κ°λ³ 맀κ°λ³μ : 맀κ°λ³μλ‘ λͺ κ°μ κ°μ΄ λ€μ΄μ¬μ§ λͺ¨λ₯Ό λ μ¬μ©ν μ μμΌλ©°, ν¨μλ§λ€ κ°λ³ 맀κ°λ³μλ νλλ§ κ°μ§ μ μμ
γγπ νμ
λ€μ β¦μΌλ‘ λνλ
γγπ func hello(_ num: Int, _ result: Intβ¦) { ~ }
π μ΄κ±°νμ κ° μΌμ΄μ€κ° κΈ°λ³Έμ μΌλ‘ κ°κ³ μλ κ°
π κ° μΌμ΄μ€λ μμκ°μ κ°μ§κ³ μμ§ μμ μ μμ // μ΄κ±°νμ μ΄λ¦λ§ μκ³ νμ
μ μμ΄ μ μΈλμ΄ μλ κ²½μ°
π μ μνμ 첫λ²μ§Έ μΌμ΄μ€ κΈ°λ³Έμ μΌλ‘ 0, ν μΌμ΄μ€μ μμκ°μ μ΄μ μΌμ΄μ€μ μμκ° + 1
π μ€μνμ 첫λ²μ§Έ μΌμ΄μ€ κΈ°λ³Έμ μΌλ‘ 0, ν μΌμ΄μ€μ μμκ°μ μ΄μ μΌμ΄μ€κ° μ μκ°μΌ κ²½μ° + 1, μ΄μ μΌμ΄μ€κ° μ€μνμΌ κ²½μ° μλ¬
π Stringνμ μμκ°μ κΈ°λ³Έμ μΌλ‘ μμ μ case μ΄λ¦μ κ° νΉμ μ§μ μ§μ ν κ°
π Characterμ μμκ°μ λͺ¨λ μ§μ μ μΈν΄μΌ ν¨
π μ΄κ±°νμμ κ° μΌμ΄μ€λ€μ κ°μ λ¨ νλμ μμκ°λ§ κ°μ§ μ μμ
π μ΄λ¬ν λ¨μ μ 보μνκΈ° μν΄ κ° μΌμ΄μ€κ° μν©μ λ°λΌ λ€λ₯Έ κ°μ κ°μ§κ² νκΈ° μν΄μ μ¬μ©νλ κ°λ
π μΌμ΄μ€μ νν ννλ‘ νμ
μ λͺ
μνμ¬ μ¬μ©
γγπ case caseName(model: String)
γγπ case caseName(model: String, size: Int)
γγπ let a: ENUM~ = ENUM~.caseName(model: βhelloβ, size: 10) // μ§μ κ°μ μ§μ νμ¬ μ¬μ©
π Link
π ex1) enum switch
let commute = Transportation.subway(line: 2, express: false)
switch commute { // μ¬κΈ°μ Transportation νμ
μΆλ‘
case .subway(2): ~ // λ°λΌμ, μλ΅ κ°λ₯
case .car: ~
case .bus(1): ~
case .bus(2, "seoul", _): ~
case .bus(3, let src, let dest): ~
// λͺ¨λ λ³μμ λ°μΈλ© λ°©μμ΄ λμΌνλ€λ©΄ letμ΄λ varμ 맨 μμ μΈ μ μμ
case let .plain(line, station):
print("line: \(line), station: \(station)")
default:
break // κ° caseμ breakκ° μλ΅λμ΄ μμΌλ©°, 곡λμ νμ©νμ§ μκΈ°μ do nothing κΈ°λ₯μ μν΄μλ breakλ₯Ό λͺ
μμ μΌλ‘ μμ±ν΄μΌ ν¨
}
π ex2) enum if
let commute = Transportation.subway(line: 2, express: false)
if case let .subway(2, express) = commute { ~ }
// #1 letμ caseλ€μ μμ±ν¨μΌλ‘μ¨ μΈμμ letμ μ μ§ μμλ λ¨ // if case .subway(2, let express) = commute
// #2 commuteκ° μΌμͺ½κ³Ό 맀μΉλλμ μλ―Έ
// #3 .subwayλ‘ μμ±μ΄ κ°λ₯ν μ΄μ λ μ€λ₯Έμͺ½μΌλ‘λΆν° νμ
μ μ°Έκ³ νμκΈ° λλ¬Έ
// #4 if case let ; switchλ¬Έκ³Ό κ°μ΄ λͺ¨λ μΌμ΄μ€λ₯Ό μμ±νλ κ²μ΄ μλ μνλ λ¨ νλμ κ²½μ°λ§ 체ν¬ν μ μλλ‘ νμ¬ νΈνκ² μ¬μ©νλλ‘ νλ swift λ¬Έλ²
// ; The Swift If-Case-Let syntax is a convenient shortcut to avoid a full switch statement when you only want to match a single case.
π enumμ μ°μ° νλ‘νΌν°λ λ©μλλ₯Ό ν¬ν¨ν μ μμΌλ©°, νμ₯μ΄ κ°λ₯νκ³ , νλ‘ν μ½μ λ°λ₯΄λλ‘ μ μν μ μμ
γγπ ex)
enum HTTPCode: Int {
case OK = 200
case NOT_MODIFY = 304
case SERVER_ERROR = 500
var value: String { // μ°μ° νλ‘νΌν° (μ½κΈ° μ μ©, get μλ΅)
return "HTTP number is \(self.rawValue)"
}
var code: Int {
switch self { // μ¬κΈ°μ selfλ μμ μ μΌμ΄μ€λ₯Ό μλ―Έ
case .OK: return 2022
case .NOT_MODIFY: return 2023
//...
}
}
func getDescription () -> String { // λ©μλ ν¬ν¨ κ°λ₯ (μΈμ€ν΄μ€ λ©μλ)
switch self { // μ¬κΈ°μ selfλ μμ μ μΌμ΄μ€λ₯Ό μλ―Έ
case .OK:
return "HTTP μ½λλ \(self.rawValue) μ
λλ€"
//...
}
}
static func getName() -> String { // νμ
λ©μλ
return "μ΄κ±΄ HTTPCodeμΌ~~"
}
}
π Self : νμ
νλ‘νΌν°μ νμ
λ©μλλ₯Ό κ°λ¦¬ν¬ λ μ¬μ©
π self : μΈμ€ν΄μ€ νλ‘νΌν°μ μΈμ€ν΄μ€ λ©μλλ₯Ό κ°λ¦¬ν¬ λ μ¬μ©
π μ μ₯ νλ‘νΌν° : ν΄λμ€/ꡬ쑰체 μμ μ¬μ©
γγπ ν΄λμ€/ꡬ쑰체μ μΈμ€ν΄μ€μ μΌλΆκ° λλ μμ(let) λ° λ³μ(var)
γγπ letμΌλ‘ μ μΈλ μ μ₯ νλ‘νΌν°λ μμ λΆκ°λ₯
γγπ varλ‘ μ μΈλ μ μ₯ νλ‘νΌν°λ μμ κ°λ₯
γγπ μ μΈ μ μ΄κΈ°κ°μ μ§μ ν μ μμΌλ©°, μμ λν κ°λ₯
γγπ lazy μ μ₯ νλ‘νΌν°
γγγγπ ν΄λΉ μ μ₯ νλ‘νΌν°λ μ¬μ©λκΈ° μ κΉμ§ μμ±λμ§ μμ
γγγγγγπ λ°λΌμ, μ νμ©ν κ²½μ° μ±λ₯ ν₯μ, 곡κ°λλΉλ₯Ό μ€μΌ μ μλ€λ μ₯μ μ΄ μμ
γγγγπ λ°λμ varλ‘ μ μΈλμ΄μΌ ν¨
γγγγγγπ letμΌλ‘ μ μΈλ νλ‘νΌν°λ μ΄κΈ°νλ₯Ό ν¨κ³Ό λμμ κ°μ νμλ‘ νκΈ° λλ¬Έμ, κ°μ΄ νμν λμ μ΄κΈ°νλ₯Ό νλ lazyμλ κ±°λ¦¬κ° μμ
π Link
π μ°μ° νλ‘νΌν° : ν΄λμ€/ꡬ쑰체/μ΄κ±°ν μμ μ¬μ©
γγπ λ°λμ varλ‘ μ μΈν΄μΌ ν¨
γγγγπ μ°μ° νλ‘νΌν°λκΉ κ°μ΄ λ³κ²½λμ΄μΌ ν¨
γγγγπ μ°μ°λ κ°μ μ μ₯ν 곡κ°, μ¦, λ€λ₯Έ λ³μ(μ μ₯ νλ‘νΌν°)λ₯Ό λ°λμ νμλ‘ ν¨
γγπ μ°μ° νλ‘νΌν°λ get, set λ©μλ κ°μ§κ³ μμ
γγγγπ getλ§ μ μΈ O (μ½κΈ° μ μ©)
γγγγγγπ getλ§ μλ μ½κΈ° μ μ© μ°μ° νλ‘νΌν°λ get μλ΅ κ°λ₯
γγγγγγπ μ¦, λ¨μν { return } μΌλ‘ μμ± κ°λ₯
γγγγπ get/set μ μΈ O (μ½κΈ°/μ°κΈ°)
γγγγπ setλ§ μ μΈ X
γγπ getμ return νμ
μ μ°μ° νλ‘νΌν°μ νμ
κ³Ό λ°λμ κ°μμΌ ν¨
γγπ setμ μμ± λ°©μ, λ κ°μ§
γγγγπ set { x(μ μ₯ νλ‘νΌν°) = newValue + 1 }
γγγγπ set(tempX) { x(μ μ₯ νλ‘νΌν°) = tempX + 1 }
γγπ ex)
struct Info {
var num = 3 // μ μ₯ νλ‘νΌν°
var cal: Int { // μ°μ° νλ‘νΌν°
get {
let tempX = num + 3
return tempX // return νμ
μ μ
}
set(value) {
num = value - 3
}
}
}
π Link
π νμ
νλ‘νΌν° : ν΄λμ€/ꡬ쑰체/μ΄κ±°ν μμ μ¬μ©
γγπ static ν€μλλ₯Ό λΆμμΌλ‘μ¨ νμ
νλ‘νΌν°λ₯Ό μ μν μ μμ
γγπ νμ
νλ‘νΌν°μλ μ μ₯ νμ
νλ‘νΌν°, μ°μ° νμ
νλ‘νΌν°κ° μμ
γγπ μ μ₯ νμ
νλ‘νΌν°
γγγγπ let / varλ‘ μ μΈ κ°λ₯
γγγγπ 무쑰건 κΈ°λ³Έκ°μ μ€μ ν΄μΌ ν¨
γγγγπ μ²μ μ‘μΈμ€ ν λλ lazyμ κ°μ΄ μλμΌλ‘ μ§μ° μ΄κΈ°ν
γγγγγγπ μ¦, lazy ν€μλλ νμ X
γγπ μ°μ° νμ
νλ‘νΌν°
γγγγπ λ°λμ varλ‘ μ μΈν΄μΌ ν¨(μ°μ° μΈμ€ν΄μ€ νλ‘νΌν°μ²λΌ)
γγγγπ ν΄λμ€ νμ
μ λν μ°μ° νμ
νλ‘νΌν°μ κ²½μ° static λμ class ν€μλλ₯Ό λΆμμΌλ‘μ¨ μλΈ ν΄λμ€κ° μνΌ ν΄λμ€μ ꡬνμ μ€λ²λΌμ΄λ ν μ μμ
γγγγπ μλΈ ν΄λμ€μμ static ν€μλ μμ override ν€μλλ₯Ό λΆμ¬μΌ ν¨
γγγγγγπ override static var ~
γγγγπ νμ
νλ‘νΌν°λ νμ
μ체μ .μ°μ°μλ₯Ό ν΅ν΄ νλ‘νΌν°μ μ κ·Ό
γγγγγγπ λ°λ©΄μ, μΈμ€ν΄μ€ νλ‘νΌν°λ μΈμ€ν΄μ€μ .μ°μ°μλ₯Ό ν΅ν΄ νλ‘νΌν°μ μ κ·Ό
π Link
π νλ‘νΌν° μ΅μ λ²λ lazy ν€μλκ° μλ μ μ₯ νλ‘νΌν°μ μΆκ°ν μ μμ
γγπ λΆλͺ¨ ν΄λμ€μ μ°μ° νλ‘νΌν°λ₯Ό μ€λ²λΌμ΄λ© ν κ²½μ° λν νλ‘νΌν° μ΅μ λ²λ₯Ό μΆκ°νλ κ²μ΄ κ°λ₯
π willSet
γγπ κ°μ΄ μ€μ λκΈ° μ§μ μ νΈμΆλλ λ©μλ, μλ‘κ² μ€μ λ κ°μ΄ newValue
γγπ willSet μμ± λ°©μ, λ κ°μ§
γγγγπ willSet { newValue }
γγγγπ willSet(A) { A }
π didSet
γγπ μλ‘μ΄ κ°μ΄ μ€μ λ μ§νμ νΈμΆλλ λ©μλ, μλ‘ μ€μ λκΈ° μ΄μ μ κ°μ΄ oldValue
γγπ didSet μμ± λ°©μ, λ κ°μ§
γγγγπ didSet { oldValue }
γγγγπ oldSet(B) { B }
π ex)
class StepCounter {
var totalSteps: Int = 0 {
willSet(newTotalSteps) {
print("totalStepsμ \(newTotalSteps)λ‘ μ€μ νλ €κ³ ν©λλ€.")
}
didSet(oldTotalSteps) {
if totalSteps > oldTotalSteps {
print("\(totalSteps - oldTotalSteps)κ±Έμμ΄ μΆκ°λμμ΅λλ€.")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// totalStepsμ 200λ‘ μ€μ νλ €κ³ ν©λλ€. (willSet)
// 200(200 - 0)κ±Έμμ΄ μΆκ°λμμ΅λλ€. (didSet)
π structμ enumμ μΈμ€ν΄μ€λ κ° νμ
μ΄μ§λ§, classμ μΈμ€ν΄μ€λ μ°Έμ‘° νμ
π structμ enumμ μμμ΄ λΆκ°λ₯νμ§λ§, classλ μμμ΄ κ°λ₯
π structμ classλ μμ±μκ° μμ§λ§, enumμλ μμ±μκ° μμ
βοΈ ν΄λμ€μ ꡬ쑰체μ 곡ν΅μ , μ°¨μ΄μ
γγπ ꡬ쑰체 : κ° νμ
γγγγπ var μ μΈ μ var μ μ₯ νλ‘νΌν° κ° λ³κ²½ κ°λ₯
γγγγπ let μ μΈ μ λͺ¨λ μ μ₯ νλ‘νΌν° μμν λμ΄ κ° λ³κ²½ λΆκ°λ₯
γγγγπ μμ±μκ° μμ΄λ λ¨
γγγγγγπ κΈ°λ³Έμ μΌλ‘ μ μ₯ νλ‘νΌν°λ€μ νλΌλ―Έν°λ‘ κ°μ§λ μ΄λμ
λΌμ΄μ Έκ° μμΌλ©° μ΄κΈ°κ°μ μ€λ€λ©΄ νμ κ°μ μ€μ ν΄μ£Όμ§ μμλ λ¨
γγπ ν΄λμ€ : μ°Έμ‘° νμ
γγγγπ let/var μ μΈ κ΄κ³ μμ΄ var μ μ₯ νλ‘νΌν° κ° λ³κ²½ κ°λ₯
γγγγπ let μ μ₯ νλ‘νΌν°λ λ³κ²½ λΆκ°λ₯
γγγγπ μ μ₯ νλ‘νΌν°μ μ΄κΈ°κ°μ΄ μμΌλ©΄ μμ±μ(init) λ°λμ νμ
γγγγγγπ λ¨, μ μ₯ νλ‘νΌν°μ μ΄κΈ°κ°μ΄ μ§μ λμ΄ μλ€λ©΄ μμ±μκ° μμ΄λ λ¨
π μμμ΄ μλ ν΄λμ€λ finalλ‘ μ μΈνκΈ°
γγπ class μ±λ₯ ν₯μμ Dispatch κ³Όμ κ΄λ ¨
γγπ Dispatch? μ΄λ ν λ©μλλ₯Ό μ€ννμ¬ μ²λ¦¬ν μ§ κ²°μ νλ κ³Όμ (λ°μΈλ© in C++)
γγπ Dispatch μ’
λ₯?
γγγγπ Static Dispatch : μ»΄νμΌ μμ μ μ΄λ€ λ©μλκ° μ¬μ©λ μ§ κ²°μ
γγγγπ Dynamic Dispatch : λ°νμ μμ μμ μ΄λ€ λ©μλκ° μ¬μ©λ μ§ κ²°μ
γγγγγγπ Dynamic Dispatchλ μ°Έμ‘°μ λ°λΌ ν¨μλ₯Ό νΈμΆνκΈ° λλ¬Έμ overheadκ° λ°μ
γγγγγγπ μ΄λ¬ν overheadλ μμμ΄ κ°λ₯ν classμ override λ μ μλ λ©μλμμ λ°μ
γγγγγγπ λ°λΌμ, overrideκ° νμ€ν λμ§ μμμ μ»΄νμΌλ¬μκ² μλ €μ£Όλ©΄ overheadκ° λ°μνμ§ μμ μ±λ₯μ΄ ν₯μ
π μΈλΆ μ κ·Όμ΄ μλ κ²½μ° private ν€μλ μ¬μ©νκΈ°
π λ³κ²½μ΄ μλ λ³μλ let ν€μλλ₯Ό μ¬μ©νκΈ°
π λ³μ μ μΈ μ νμ
μ μ§μ νκΈ°
π nilμ νμ© μ¬λΆλ₯Ό λνλ΄λ κ²
π μ΅μ
λ μ’
λ₯ 2κ°μ§
γγπ ? : μ΅μ
λ
γγγγπ ex)
var optionalValue: Int? = 100
optionalValue = optionalValue + 1 // κΈ°μ‘΄ λ³μμ²λΌ μ¬μ© λΆκ°
optionalValue = nil // nil ν λΉ κ°λ₯
γγπ ! : 묡μμ μΆμΆ μ΅μ
λ
γγγγπ Non-Optional TypeμΌλ‘ μ²λ¦¬λμ΄μΌ ν λ κ°μ μλμΌλ‘ μΆμΆν΄μ£Όλ μ₯μ μ΄ μμ
γγγγπ μλͺ» μ¬μ© μ, λ°νμ μλ¬κ° λ°μν μ μμ
var optionalValue: Int! = 100
optionalValue = optionalValue + 1 // κΈ°μ‘΄ λ³μμ²λΌ μ¬μ© κ°λ₯
optionalValue = nil // nil ν λΉ κ°λ₯
optionalValue = optionalValue + 1 // μ΅μ
λμ nilμ΄ ν λΉλμ΄ μμ λ μ κ·Ό μλ -> λ°νμ μ€λ₯
π λͺ
μμ ν΄μ
γγπ κ°μ μΈλν : ! ν€μλ μ¬μ©
var number: Int? = 3
print(number) // Optional(3)
print(number!) // 3
γγπ λΉκ°μ μΈλν : μ΅μ λ λ°μΈλ©
if let result = number { // μ΅μ
λ λ°μΈλ©
print(result)
} else {
print("nil")
}
π 묡μμ ν΄μ
γγπ μ»΄νμΌλ¬μ μν μλ ν΄μ
let value: Int? = 6
if value == 6 { // λΉκ΅ μ°μ°μλ₯Ό μ΄μ©νμ¬ λ€λ₯Έ κ°κ³Ό λΉκ΅ ν κ²½μ°, μ»΄νμΌλ¬κ° μλμ μΌλ‘ μ΅μ
λ κ°μ ν΄μ
print("valueκ° 6μ
λλ€.")
} else {
print("valueκ° 6μ΄ μλλλ€.")
}
γγπ μ΅μ λμ 묡μμ ν΄μ
let str = "12"
var strToInt: Int? = Int(str)
// Int() ν¨μλ 맀κ°λ³μμ μ μλ‘ λ³νλ μ μλ κ°μ΄ μ€λ©΄
// nilμ λ°ννκΈ° λλ¬Έμ μ΅μ
λ νμ
μΌλ‘ μ μΈν΄μΌ νλ€.
print(strToInt) // Optional(12)
var strToInt2: Int! = Int(str)
// μ μΈ μμ ! ν€μλλ₯Ό μ¬μ©νλ©΄ 묡μμ μΌλ‘ μ΅μ
λ ν΄μ λ₯Ό ν΄μ€λ€.
// κ°μ μΈλν λ μ¬μ©νλ ! μλ μλ―Έκ° λ€λ¦
print(strToInt2 + 1) // 13
π 미리 nil 체ν¬λ₯Ό ν¨κ³Ό λμμ Optional ν¬μ₯μ§λ₯Ό λ²κ²¨ κ°μ μμ νκ² κΊΌλ΄μ€λ λ°©μ
π κ°μ΄ μμ λλ§ κ°μ΄ λ°μΈλ© λ¨
π μ£Όλ‘ if let, if var, guard μ ν¨κ» μ¬μ©
γγπ guard : ν μ€μ§λ¦¬ κ°νΈν if ꡬ문, ꡬ문 λ€μ νμ elseλ₯Ό λ¬μμ€μΌ ν¨
π μΌνλ₯Ό μ¬μ©ν΄ μ¬λ¬ μ΅μ
λ λ³μλ€μ νκΊΌλ²μ λ°μΈλ©ν μ μμ
γγπ ex)
if let name = myName, let friend = yourName {
print("μ€ν : \(name) and \(friend)")
} else { // λ°μΈλ© μ€ν¨ μ (νλλΌλ nilμ΄ μ‘΄μ¬νλ κ²½μ°)
print("Binding Error")
}
π νμ νλ‘νΌν°μ μ΅μ
λ κ°μ΄ μλμ§ μ°μμ μΌλ‘ νμΈνλ©΄μ μ€κ°μ νλλΌλ nilμ΄ λ°κ²¬λλ€λ©΄ nilμ λ°ννλ κ²
π let count: Int? = A.num?.count
π κΈ°μ‘΄μ μ μΈλμ΄ μλ μ νμ μλ‘μ΄ μ νμ λ³μΉμ μ¬μ©ν¨μΌλ‘μ¨ μ½λμ μλ―Έμ κ°λ
μ±μ λμ΄λ κ°λ
π ex)
typealias Hi = (Int, Int, Int)
typealias Hello = (title: Int, content: Int, writer: Int)
var hi: Hi = (3, 3, 3)
var hi2 = Hi(4, 4, 4)
var hello: Hello = (title: 1, content: 2, writer: 3)
var hello2 = Hello(title: 4, content: 5, writer: 6)
print(hi.0) // 3
print(hi2.0) // 4
print(hello.title) // 1
print(hello2.writer) // 6
π is : νμ
νμΈ λ° μλΈν΄λμ€ νμΈ
π as : νμ
λ³ν
γγπ μ
μΊμ€ν
: μλΈν΄λμ€λ₯Ό μνΌν΄λμ€λ‘ λ§λλ κ², νμ μ±κ³΅
γγπ λ€μ΄μΊμ€ν
: μνΌν΄λμ€λ₯Ό μλΈν΄λμ€λ‘ λ§λλ κ², μ€ν¨ν μ μκΈ°μ as? νΉμ as! μ¬μ©
π Instance Method
γγπ μΈμ€ν΄μ€ννμ¬ μμ±λ μΈμ€ν΄μ€λ₯Ό ν΅ν΄ νΈμΆν μ μλ λ©μλ
π Type Method
γγπ μΈμ€ν΄μ€μ μμ± μμ΄ νμ
μ체μμ λ°λ‘ νΈμΆν μ μλ λ©μλ
γγπ Static Method
γγγγπ subclassμμ μ€λ²λΌμ΄λ©μ΄ λΆκ°λ₯ν λ©μλ
γγπ Class Method
γγγγπ subclassμμ μ€λ²λΌμ΄λ©μ΄ κ°λ₯ν λ©μλ
π Designated init
γγπ Swiftμ μ΄κΈ°ν μ΄λμ
λΌμ΄μ Έλ‘, ν΄λμ€μ λͺ¨λ νλ‘νΌν°λ₯Ό μ΄κΈ°νμν€λ μν
γγπ init μ΄λΌκ³ λ λΆλ¦Ό
γγγγπ λͺ¨λ νλ‘νΌν°λ€μ init ν¨μκ° λλκΈ° μ (μ΄κΈ°ν μ’
λ£ μ )μ λͺ¨λ μ΄κΈ°κ°μ κ°μ§κ³ μμ΄μΌ ν¨
γγγγγγπ λ§μ½ μ΄κΈ°κ°μ΄ μλ νλ‘νΌν°κ° μμ κ²½μ°, μ΄κΈ°νμ μ€ν¨νμ¬ μΈμ€ν΄μ€κ° μμ±λμ§ μμ
γγγγγγπ νλ‘νΌν° νμ
μ μ΅μ
λ νμ
μΌλ‘ μ€μ νλ κ² λν μ΄κΈ°νλ₯Ό μ§νν κ²μ (nilλ‘ μλ μ΄κΈ°ν)
γγγγγγγγπ letμΌλ‘ μ μΈλ νλ‘νΌν° νμ
μ μ΅μ
λ νμ
μΌλ‘ μ§μ ν κ²½μ° λ°λμ μ΄κΈ°κ°μ μ§μ ν΄μΌ ν¨, κ·Έλ μ§ μμΌλ©΄ μλ¬
γγγγπ μμ λ°μ μλΈ ν΄λμ€μμ D.I.λ₯Ό μμ±ν κ²½μ°, λ°λμ super ν΄λμ€μ Initializersλ₯Ό νΈμΆν΄μ£Όμ΄μΌ ν¨
γγγγπ ex)
class Human {
let name: String
var age: Int? // OK
let num: Int? // Error!
init(name: String) {
self.name = name
}
}
class Sodeul: Human {
let alias: String
init(alias: String) {
super.init(name: alias) // μμΌλ©΄ μλ¬ λ°μ
self.alias = alias
}
}
π Convinience init
γγπ 보쑰 μ΄λμ
λΌμ΄μ Έλ‘, μΌλΆ νλ‘νΌν°λ₯Ό μνλ κ°μΌλ‘ μ μ₯νλ μν μ νκΈ°μ C.i. λ΄λΆμμ λ°λμ D.i.λ₯Ό νΈμΆν΄μΌ ν¨
γγγγπ λͺ¨λ νλ‘νΌν°λ₯Ό μ΄κΈ°νν΄μ£Όλ D.i.λ₯Ό λμμ£Όλ μν
γγγγπ ex)
class Human {
var name: String
var nickName: String
init(name: String, nickName: String) {
self.name = name
self.nickName = nickName
}
convenience init(name: String) {
self.init(name: name, nickName: "unknown")
}
}
π Link
π Initializer Delegation
γγπ μμ±μμμ λ λ€λ₯Έ μμ±μλ₯Ό νΈμΆνμ¬ μ΄κΈ°ν μ½λμ μ€λ³΅μ μ΅λν μ κ±°νκ³ , λͺ¨λ νλ‘νΌν°λ₯Ό ν¨μ¨μ μΌλ‘ μ΄κΈ°ν νκΈ°μν΄ μ¬μ©νλ κ²
γγπ Wrong ex)
struct Position { // Initializer Delegation μ€μ X
var x: Int
var y: Int
// λ§μ½, Initializerμμ yλ₯Ό 무쑰건 0μΌλ‘ μ΄κΈ°ν νκ³ μΆλ€λ©΄
init(xPos: Int, yPos: Int) {
x = xPos
y = yPos // μ΄ κ³³μ y = 0μΌλ‘ μμ ν΄μΌνκ³
}
init(pos: Int) {
x = pos
y = pos // μ΄ κ³³ λν, y = 0μΌλ‘ μμ ν΄μΌ ν¨ -> μ½λ μ€λ³΅
}
}
γγπ Correct ex)
struct Position { // Initializer Delegation μ€μ O
var x: Int
var y: Int
// λ§μ½, Initializerμμ yλ₯Ό 무쑰건 0μΌλ‘ μ΄κΈ°ν νκ³ μΆλ€λ©΄
init(xPos: Int, yPos: Int) {
x = xPos
y = yPos // μ΄ κ³³λ§ y = 0μΌλ‘ μμ νλ©΄ λ :)
}
init(pos: Int) {
self.init(xPos: pos, yPos: pos)
}
}
π Link
π deinit
γγπ μλ©Έμλ‘, ν΄λμ€ μΈμ€ν΄μ€κ° λ©λͺ¨λ¦¬μμ ν΄μ λκΈ° μ§μ μ νΈμΆλ¨
π required init?
γγπ code ex)
class SampleView: UIView {
override init(frame: CGRect) {
//code
}
required init?(coder: NSCoder) {
//code
}
}
γγπ μ½κ² λ§ν΄, UIView/UIViewControllerλ₯Ό μμλ°λ ν΄λμ€μμ νλ‘νΌν°λ₯Ό μ μΈνκ³ init() λ©μλλ₯Ό μμ±ν κ²μΈλ°, μνΌν΄λμ€κ° NSCoding νλ‘ν μ½μ μ€μνκΈ°μ, required init?(coder: NSCoder) λ©μλλ₯Ό μμ±ν΄μΌ ν¨
γγγγπ NSCoding νλ‘ν μ½μ μ΄λ₯Ό ꡬννλ ν΄λμ€λ‘λΆν° μ€ν¨ κ°λ₯ν μ΄λμ
λΌμ΄μ λ₯Ό μμ±νλλ‘ ν¨
γγγγγγπ ν΄λμ€κ° encoding κ³Ό decoding λλ κ²μ κ°λ₯νκ² ν΄μ£Όλ νλ‘ν μ½
γγγγγγπ λ€μ λ§νλ©΄, NSCodingμ μ±νν ν΄λμ€λ encoding λ° decoding κ°λ₯
γγγγπ νλ‘ν μ½μ μ νμλ μ΄λμ
λΌμ΄μ λ₯Ό ꡬννλ©΄ required ν€μλκ° λΆμΌλ©°, required ν€μλκ° λΆμ μ΄λμ
λΌμ΄μ λ₯Ό μμλ°λ μμ ν΄λμ€μμλ μ΄λ₯Ό ꡬνν΄μ€μΌ ν μλ μμ
γγγγπ UIView/UIViewControllerλ NSCoding νλ‘ν μ½μ ꡬννκ³ μκΈ° λλ¬Έμ, μ΄λ₯Ό μμλ°μ ν΄λμ€μμλ required init?(coder: )λ₯Ό ꡬνν΄μ€μΌ ν μλ μμ
γγγγγγπ μ¦, μμ μμ±μ μνκ±°λ, initμ μμ±νλ€λ©΄ λ°λμ κ°μ΄ μμ±ν΄μΌ ν¨
γγγγγγγγπ swiftμμλ μμ ν΄λμ€μμ μ§μ μ΄λμ
λΌμ΄μ λ₯Ό λ°λ‘ μμ±νμ§ μμ κ²½μ°, λΆλͺ¨μ μ΄λμ
λΌμ΄μ Έλ€μ μλμΌλ‘ μμ
γγγγγγγγπ λ°λΌμ, μλ‘μ΄ D.i.λ₯Ό μμ ν΄λμ€μμ μμ±νμ§ μμμ κ²½μ°μ μλ¬κ° λ°μνμ§ μμμ
γγγγγγγγπ νμ§λ§, μμν΄λμ€μμ μλ‘μ΄ D.i.λ₯Ό μμ±νκ² λλ€λ©΄, λΆλͺ¨ ν΄λμ€μ μ΄λμ
λΌμ΄μ λ€μ΄ μλ μμνμ§ μκΈ° λλ¬Έμ, required init?(coder: )λ₯Ό ꡬννλΌλ μλ¬κ° λ°μ
γγπ codeλ‘ customν UIView/UIViewController λ± λ¬΄μΈκ°λ₯Ό λ§λ€ λμ initμ λ°λμ ν΄μΌ νλ μ΄μ ?
γγγγπ μΈν°νμ΄μ€ λΉλμμλ μλμΌλ‘ μ΄κΈ°νλ₯Ό ν΄μ£Όμ§λ§, μ½λμμλ μΈν°νμ΄μ€ λΉλλ₯Ό μ¬μ©νλ κ² μλκΈ° λλ¬Έμ μ΄κΈ°νλ₯Ό νμ§ μλλ€λ©΄ μ무κ²λ λ¨μ§ μκΈ° λλ¬Έ
γγγγγγπ μΈν°νμ΄μ€ λΉλμ λνμ μΈ μμ : Storyboard, Xib
γγγγπ λ€μν μ¬μ© μμ
γγγγγγπ override init(frame: CGRect) // UIView
γγγγγγπ override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) // UIViewController
γγγγγγπ override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) // UITableViewCell
γγγγγγπ override init(reuseIdentifier: String?) // UITableViewHeaderFooterView
π Link
π Link
π init? π init!
γγπ init? : μ΄κΈ°νμ μ±κ³΅νλ©΄ μ΄κΈ°νλ μΈμ€ν΄μ€κ° βOptional TypeβμΌλ‘ 리ν΄, μ΄κΈ°νμ μ€ν¨νλ©΄ βnilβμ 리ν΄
γγπ init! : μ΄κΈ°νμ μ±κ³΅νλ©΄ μ΄κΈ°νλ μΈμ€ν΄μ€κ° βNon Optional TypeβμΌλ‘ 리ν΄, μ΄κΈ°νμ μ€ν¨νλ©΄ ν¬λμκ° λ°μ
π λ°λμ κ°μ ΈμΌ ν νλ‘νΌν°λ λ©μλλ₯Ό μ μλ§ νλ μ²μ¬μ§ μν
π νλ‘ν μ½μ μ μ©ν κ°μ²΄λ, νλ‘ν μ½μμ μ μνλ νλ‘νΌν°μ λ©μλλ₯Ό λ°λμ ꡬνν΄μΌ ν¨
π νλ‘ν μ½μ νλ‘νΌν°κ° μ μ₯ νλ‘νΌν°μΈμ§, μ°μ° νλ‘νΌν°μΈμ§ λͺ
μνμ§ μμ
π λμ μ½κΈ°λ§ κ°λ₯νμ§, μ½κΈ°/μ°κΈ° λͺ¨λκ° κ°λ₯νμ§ λͺ
μν΄μΌ ν¨
π λν, νλ‘ν μ½μ νλ‘νΌν°λ λ°λμ varλ‘ μ μΈλμΌ ν¨
π ex)
π νλ‘ν μ½μ νλ‘νΌν°κ° getλ§ νμλ‘ νλ κ²½μ°, λͺ¨λ μ’
λ₯μ νλ‘νΌν°μμ μꡬμ¬νμ μΆ©μ‘±μν¬ μ μμ
γγπ μμ μ μ₯ νλ‘νΌν°
protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
let fullName: String
}
var john = Person(fullName: "John Appleseed")
john.fullName = "Zedd" // error! 'fullName' is a 'let' constant
γγπ λ³μ μ μ₯ νλ‘νΌν°
protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
var fullName: String
}
var john = Person(fullName: "John Appleseed")
john.fullName = "Zedd" // ok
γγπ μ°μ° νλ‘νΌν° get
protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
var name: String // μ€μ κ° μ μ₯λ μ μ₯ νλ‘νΌν°
var fullName: String {
return name
}
}
var john = Person(name: "John Appleseed")
john.fullName = "Zedd" // error! 'fullName' is a get-only property
print(john.fullName) // ok
γγπ μ°μ° νλ‘νΌν° get/set
protocol FullyNamed {
var fullName: String { get }
}
struct Person: FullyNamed {
var name: String // μ€μ κ° μ μ₯λ μ μ₯ νλ‘νΌν°
var fullName: String {
get {
return name
}
set {
name = newValue
}
}
}
var john = Person(name: "John Appleseed")
john.fullName = "Zedd" // ok
print(john.fullName) // ok
π νλ‘ν μ½μ νλ‘νΌν°κ° getκ³Ό set λͺ¨λ νμλ‘ νλ κ²½μ°, μμ μ μ₯ νλ‘νΌν°μ μ½κΈ° μ μ© μ°μ° νλ‘νΌν°κ° λ μ μμ
γγπ μμ μ μ₯ νλ‘νΌν°
protocol FullyNamed {
var fullName: String { get set }
}
struct Person: FullyNamed {
let fullName: String // error! error: type 'Person' does not conform to protocol 'FullyNamed'
}
var john = Person(fullName: "John Appleseed")
γγπ λ³μ μ μ₯ νλ‘νΌν°
protocol FullyNamed {
var fullName: String { get set }
}
struct Person: FullyNamed {
var fullName: String
}
var john = Person(fullName: "John Appleseed")
john.fullName = "Zedd" // ok
γγπ μ°μ° νλ‘νΌν° get
protocol FullyNamed {
var fullName: String { get set }
}
struct Person: FullyNamed {
var name: String // μ€μ κ° μ μ₯λ μ μ₯ νλ‘νΌν°
var fullName: String {
return name // error! error: type 'Person' does not conform to protocol 'FullyNamed'
}
}
var john = Person(name: "John Appleseed")
γγπ μ°μ° νλ‘νΌν° get/set
protocol FullyNamed {
var fullName: String { get set }
}
struct Person: FullyNamed {
var name: String // μ€μ κ° μ μ₯λ μ μ₯ νλ‘νΌν°
var fullName: String {
get {
return name
}
set {
name = newValue
}
}
}
var john = Person(name: "John Appleseed")
john.fullName = "Zedd" // ok
print(john.fullName) // ok
π Anyλ ν¨μ νμ
μ ν¬ν¨ν λͺ¨λ νμ
μ μΈμ€ν΄μ€λ₯Ό λνλΌ μ μλ νλ‘ν μ½
π λ°λ©΄, AnyObjectλ ν΄λμ€ νμ
μ μΈμ€ν΄μ€λ§μ λνλΌ μ μλ νλ‘ν μ½
π κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
γγπ μμμ ν΅ν΄ μμ§μ μΌλ‘ νμ
μ νμ₯νλ ꡬ쑰
γγπ νλμ μλΈν΄λμ€λ νλμ μνΌν΄λμ€λ§ κ°μ§ μ μλ€λ μ νμ΄ μμ
γγπ μνΌν΄λμ€λ₯Ό κ·Έλλ‘ μμ λ°κΈ°μ λΆνμν λ³μμ λ©μλλ₯Ό λͺ¨λ λ¬Όλ € λ°μμΌ νλ λ¨μ
π νλ‘ν μ½ μ§ν₯ νλ‘κ·Έλλ°
γγπ νλ‘ν μ½ νμ₯μ ν΅ν΄ μνμ μΌλ‘ νμ
μ νμ₯νλ ꡬ쑰
γγπ μμκ³Όλ λ€λ₯΄κ² λ€μμ νλ‘ν μ½μ κ°μ§λ κ²μ΄ κ°λ₯
γγπ λΆλͺ¨ νλ‘ν μ½κ³Ό μμ νλ‘ν μ½ μ¬μ΄κ° μλ‘ λ
립μ μ΄κΈ°μ λΆνμν νλ‘νΌν°λ λ©μλλ₯Ό κ°μ§ μκ² ν μ μμ
π 컬λ μ μ΄ λ³΄μ ν κ° κ°λ€μ 맀κ°λ³μλ‘ μ λ¬λ°μ ν¨μμμ λ‘μ§μ μ²λ¦¬ν ν μλ‘μ΄ μ»¬λ μ μΌλ‘ λ°ννλ ν¨μ
π 컬λ μ μ΄ λ³΄μ ν κ°λ€ μ€ λ§€κ°λ³μλ‘ μ λ¬λ°μ ν¨μμ κ²°κ³Όκ° TrueμΈ κ°λ§ μλ‘μ΄ μ»¬λ μ μ λ£μ΄ λ°ννλ ν¨μ
π μ΄κΈ°κ°μ 컬λ μ μ΄ λ³΄μ ν κ° κ°λ€μ 맀κ°λ³μλ‘ μ λ¬λ°μ ν¨μμμ λͺ¨λ κ³μ°νμ¬ μ°μ° κ²°κ³Όλ‘ λ°ννλ ν¨μ
π Swift 4.1λΆν° flatMapμ 2μ°¨μ λ°°μ΄μ 1μ°¨μ λ°°μ΄λ‘ λ§λλ μν
γγπ κΈ°μ‘΄μ flatMapμ λ°°μ΄μ flattenνκ² λ§λ€μ΄ μ£Όκ³ , nilμ μ κ±°νλ©°, μ΅μ
λ λ°μΈλ©μ νλ μν
π Swift 4.1λΆν° 1μ°¨μ λ°°μ΄μμ nilμ μ κ±°νκ³ μ΅μ
λ λ°μΈλ©μ νκ³ μΆμ λ compactMapμ μ¬μ©
γγπ compactMapμ 2μ°¨μ λ°°μ΄μ 1μ°¨μ λ°°μ΄λ‘ λ§λ€μ§ μμ
π nilμ΄ ν¬ν¨λ 2μ°¨μ λ°°μ΄μμ flatmapκ³Ό compactmapμ μμλλ‘ μ²΄μ΄λ μ°κ²°νλ©΄ 1μ°¨μ λ°°μ΄λ‘ nilμ μ κ±°νκ³ μ΅μ
λ λ°μΈλ©μ ν΄μ€ μ μμ
π 1μ°¨μ λ°°μ΄μμλ λμΌν κ²°κ³Ό
π Insertion Sortμ Merge Sortκ° ν©μ³μ§ ννμΈ Tim Sortλ‘ κ΅¬νλμ΄ μμ
π μκ° λ³΅μ‘λ : μ΅μ μ κ²½μ° O(n), μ΅μ
μ κ²½μ° O(nlogn)
π μ±κ³΅κ³Ό μ€ν¨μ λν κ²°κ³Ό κ°μ λ°ννκ³ μΆμ λ μ¬μ©νλ νμ
π Result νμ
μ enumμ΄λ©°, λ κ°μ μ λ€λ¦ν κ²°κ³Όλ₯Ό 리ν΄
γγπ Failure νμ
μ Errorλ₯Ό μμλ°μ νμ
μ΄μ΄μΌ ν¨
γγπ Success νμ
μ void, string, int λ± κ° νμ
μ μ¬μ©ν΄λ λ¨
π 컬λ μ
, 리μ€νΈ, μνμ€ λ± μ§ν©μ νΉμ μμμ μ½κ² μ κ·Όν μ μλ λ¬Έλ²
π λ°°μ΄μμλ μΈλ±μ€λ₯Ό ν΅ν΄, λμ
λ리μμλ ν€ κ°μ ν΅ν΄ μ κ·Ό
π ex)
var dict = ["Kim": 1, "Lee": 2]
dict["Park"] = 3 // Subscript λ¬Έλ²
var arr = [3, 2, 4, 8]
arr[0] = 1 // Subscript λ¬Έλ²
print(arr[0]) // Subscript λ¬Έλ²
π Collection
γγπ Collection νλ‘ν μ½μ Sequence νλ‘ν μ½μ μ€μνκ³ μμ
γγπ λνμ μΌλ‘, Array, Set, Dictionaryκ° Collection νλ‘ν μ½μ μ€μνκ³ μμ
π Sequence
γγπ κ° μμμ μμ°¨μ μ΄κ³ λ°λ³΅μ μΈ μ κ·Όμ΄ κ°λ₯ν νμ
π λ°μ΄ν° λ³΅μ¬ μ μ€μ λ‘ κ°μ 볡μ¬νμ§ μκ³ λ¨μν κ°μ μ°Έμ‘°λ§ νλ€κ° λ°μ΄ν° λ³κ²½μ΄ λ°μλ μ κ°μ 볡μ¬ν΄ λ³κ²½νλ κΈ°λ²
π Collection Typeμ 볡μ¬ν΄μ μ¬μ©ν λ μΌμ΄λ¨
γγπ Swiftμμλ κΈ°λ³Έμ μΌλ‘ Collection νμ
μ COWκ° κ΅¬νλμ΄ μκΈ° λλ¬Έ
π λ¨μν κ°μ μ°Έμ‘°λ§ νλ€κ° λ°μ΄ν° λ³κ²½μ΄ λ°μλ μ κ°μ 볡μ¬νμ¬ λΆνμν 볡μ¬λ₯Ό μ€μ΄λ 맀컀λμ¦
π κΈ°μ‘΄μ μ€λ²ν€λλ₯Ό μ€μΌ μ μμ
π μμ±λλ μ¬λ³Έ μλ₯Ό νμΈνκΈ° μν΄ Reference Countλ₯Ό κ³μ°ν΄μΌ νλ€λ λ¨μ μ΄ μ‘΄μ¬
π swiftμμ stringμ κ° νμ
μΌλ‘ λΆλ₯λλ©°, characterμ collection
π characterλ κ°κ° λ€λ₯Έ ν¬κΈ°μ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§ν μ μλ μ λμ½λλ₯Ό μ€μνκΈ° λλ¬Έμ Subscriptλ‘ μ κ·Ό X
π λν, character νμ
μ ν μμμ κ°μ μ μΌλ‘ μ μ₯λκΈ°μ, λ°λΌμ, Stringμ κ° νμ
μ΄μ§λ§ ν ν λΉμ΄ λ°μ
π String
γγπ ꡬ쑰체, κ° νμ
π NSString
γγπ ν΄λμ€, μ°Έμ‘° νμ
π NSAttributedString
γγπ ν
μ€νΈ μ체μ μ€νμΌμ μ€μ ν μ μλ ν
μ€νΈ νμ
π NSMutableAttributedString
γγπ NSAttributedStringμ νΉμ λ²μμ λ€μν μ€νμΌ(μμ, μκ° λ±)μ μ€μ ν μ μλ ν
μ€νΈ νμ
π Key-Value Coding
π κ°μ²΄μ κ°μ μ§μ κ°μ Έμ€μ§ μκ³ , Key λλ KeyPathλ₯Ό μ΄μ©ν΄μ κ°μ μ μΌλ‘ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ μμ νλ λ°©λ²
π ex)
struct Address {
var town: String
}
struct Person {
var address: Address
}
let address = Address(town: "Lalala")
var kid = Person(address: address)
kid[keyPath: \.address.town] // Lalala
kid[keyPath: \.address.town] = "Hello"
kid[keyPath: \.address.town] // Hello
kid.address.town // Hello
π Link
π Key-Value Observing
π κ°μ²΄μ νλ‘νΌν°μ λ³κ²½μ¬νμ λ€λ₯Έ κ°μ²΄μ μ리기 μν΄ μ¬μ©νλ μ½μ½μ νλ‘κ·Έλλ° ν¨ν΄
π Modelκ³Ό Viewμ κ°μ΄ λ
Όλ¦¬μ μΌλ‘ λΆλ¦¬λ ννΈκ°μ λ³κ²½μ¬νμ μ λ¬νλλ° μ μ©
π NSObjectλ₯Ό μμν ν΄λμ€μμλ§ KVOλ₯Ό μ¬μ©ν μ μμ
π Link
π μμ μ μΈλΆ ννμΌλ‘ μΈμ½λ©ν μ μλ μ νμΈ Encodableκ³Ό μΈλΆ ννμΌλ‘λΆν° μμ μ λμ½λ©ν μ μλ μ νμΈ Decodableλ‘ κ΅¬μ±λ νλ‘ν μ½
π μ£Όλ‘, APIμμ JSON Dataλ₯Ό λ€λ£° λ μ¬μ©
γγπ JSON Data μ€ νμν λ°μ΄ν°λ₯Ό λͺ¨λΈλ‘ μ 리ν Struct, Class νΉμ Enumμ ν΅ν΄ μ¬μ©
π μ£Όλ‘ Codable νλ‘ν μ½μμ JSON Keyλ₯Ό μ¬μ©μκ° μ μν νλ‘νΌν°μ 맀ννκΈ° μν΄ μ¬μ©νλ νλ‘ν μ½
π ex)
struct Coffee: Codable {
var name: String
enum CodingKeys: String, CodingKey {
case name = "order_Drink_Name"
}
}
π Hashable νλ‘ν μ½μ μ€μνλ©°, id νλ‘νΌν° νλλ§ κ°μ§λ μμ£Ό λ¨μν νλ‘ν μ½
π μ±νν νμ
μ idλ₯Ό ν΅νμ¬ κ³ μ κ°μ²΄λ₯Ό λΉκ΅ λ° κ΅¬λΆνκ² λλ λ°©μ
π UUID : λ²μ© κ³ μ μλ³μλ‘, κ³ μ νκ² μλ³νκΈ° μν΄ λ§λ€μ΄μ§ κ°λ
γγπ μ΄ 36κ° λ¬Έμ(32κ° λ¬Έμμ 4κ°μ νμ΄ν)μΌλ‘ ꡬμ±λμ΄ μμ
π Hashable
γγπ μ±νν νμ
μ΄ μ μΌν κ°μΌλ‘ ꡬλΆλ¨μ 보μ₯ν΄μ£Όλ νλ‘ν μ½
γγπ λ΄λΆμ hash functionμ ν΅ν΄ ν΄μ κ°μ κ²°μ
γγπ Hashableμ Equatable νλ‘ν μ½μ μμνκ³ μμ
γγγγπ Hκ° Eλ₯Ό μμν΄μΌ νλ μ΄μ
γγγγγγπ κ°μ²΄μ λμΌ μ¬λΆλ λͺ
νν νλ¨ κΈ°μ€μ νμλ‘ ν¨
γγγγγγπ Equatable : κ°μ λΉκ΅κ° κ°λ₯ν¨μ 보μ₯ν΄μ£Όλ νλ‘ν μ½
γγγγγγπ ==, != μ°μ°μλ₯Ό μ μνμ¬ κ°μ²΄μ λμΌ μ¬λΆμ κΈ°μ€μ κ²°μ ν¨
γγγγγγγγπ μ¦, Equatable νλ‘ν μ½μ μμ λ°μ Hashable νμ
μ΄ κ°μ²΄μ λμΌ μ¬λΆλ₯Ό νλ¨ν μ μλλ‘ ν¨
π enum μ΄κ±°νμ κ°λ€μ λ°°μ΄ μ»¬λ μ
κ³Ό κ°μ΄ μνν μ μλλ‘ ν΄μ£Όλ νλ‘ν μ½
π μ£Όλ‘ allCases νμ
νλ‘νΌν°μ ν¨κ» λ§μ΄ μ°μ
π κ° νμ
μ νλ‘νΌν°λ κΈ°λ³Έμ μΌλ‘ λ©μλ λ΄λΆμμ μμ ν μ μμ
π μμ μ΄ νμν κ²½μ° λ©μλ μμ mutating ν€μλλ₯Ό μ¬μ©νμ¬ μμ μ΄ κ°λ₯ν΄ μ§
γγπ λ©μλ λ΄μμ κ° νμ
μ νλ‘νΌν°λ₯Ό μμ νλ©΄, ν΄λΉ μΈμ€ν΄μ€μ 볡μ¬λ³Έμ΄ μμ±λμ΄ λ³κ²½λλ κ²
γγπ μ¦, 볡μ¬λ³Έμ΄ λ³κ²½μ΄ λ³κ²½λμμ λΏ μλμ μΈμ€ν΄μ€μ 무κ΄ν¨
γγπ mutatingμ μ΄ λ³΅μ¬λ³Έμ μλμ μΈμ€ν΄μ€λ‘ 리ν΄νλ μν λ‘ μ΄ν΄νλ©΄ λ¨
π μ΄λ―Έ μ‘΄μ¬νλ ν΄λμ€, ꡬ쑰체, νλ‘ν μ½ λ±μ νμ
μ μλ‘μ΄ κΈ°λ₯μ μΆκ°νμ¬ νμ₯νλ κ°λ
π μ°μ° νλ‘νΌν°, λ©μλ, νλ‘ν μ½ λ±μ μΆκ°ν μ μμ
π μλ³Έ μμ€ μ½λμ μ κ·Όν μ μλ μ νμ νμ₯νλ κΈ°λ₯λ ν¬ν¨λμ΄ μμ
π extension λ΄λΆμμ ν¨μ μ€λ²λΌμ΄λ© κ°λ₯νμ§?
γγπ ν΄λΉνλ λ©μλκ° Objective-Cμ νΈνλλ κ²½μ° μ€λ²λΌμ΄λ©μ΄ κ°λ₯μ νμ§λ§, μΌλ°μ μΌλ‘ κΆμ₯λλ λ°©λ²μ μλ
γγπ κ·Έ μ΄μ λ, extensionμ μΆκ°μ μΈ κΈ°λ₯μ νμ₯μ μ¬μ©νλ κ°λ
μ΄κΈ° λλ¬Έ
π ν¨μ μμμ μμ±λλ ν΄λ‘μ
π μμ±λ μμΉμ μκ΄μμ΄ ν¨μ μ’
λ£ μ§μ μ μ€νλ¨
π νΈμΆλλ μμ
γγπ νλμ μ€μ½νμμ μ¬λ¬ deferλ₯Ό μ¬μ©ν κ²½μ° μ€νμ²λΌ μμ
γγπ κ°μ₯ λ¨Όμ λ£μ defer μ½λκ° κ°μ₯ λ§μ§λ§μ νΈμΆλ¨
γγπ κ°μ₯ λ§μ§λ§μ λ£μ defer μ½λκ° κ°μ₯ λ¨Όμ νΈμΆλ¨
π deferκ° νΈμΆλκΈ° μ μ ν΄λΉ μ€μ½νκ° μλ¬ λ±μΌλ‘ μΈν΄ μ’
λ£λκ±°λ, λ¦¬ν΄ κ°μ΄ Never(λΉλ°ν)μΈ κ²½μ°μλ deferκ° νΈμΆλμ§ X
π Named Closure
γγπ μΌλ°μ μΌλ‘ μ΄λ¦μ΄ μλ ν¨μ
γγπ ex)
func hello() {
print("hello")
}
π Unnamed Closure
γγπ μ΄λ¦ μμ΄ μ¬μ©νλ μ΅λͺ
ν¨μ
γγπ μΌκΈ κ°μ²΄ νΉμ§μ κ°κ³ μμ
γγγγπ λ³μμ λ΄μ μ μμ
γγγγπ μΈμλ‘ μ λ¬ κ°λ₯
γγγγπ λ°ν κ°μ μ¬μ© κ°λ₯
γγπ ν΄λ‘μ λ Named C- & Unnamed C- λͺ¨λ ν¬ν¨νμ§λ§, λ³΄ν΅ Unnamed C-λ₯Ό ν΄λ‘μ λΌ ν¨
γγπ ex)
let closure = { (name: String) -> String in
return "Hello, \(name)"
}
π @escaping ν€μλκ° λΆμ ν΄λ‘μ
π ν¨μμ μΈμλ‘ ν΄λ‘μ λ₯Ό μ λ¬νλ λ°©μ
γγπ ν¨μμ μΈμλ‘ μ λ¬λ ν΄λ‘μ λ κΈ°λ³Έμ μΌλ‘ ν¨μμ μ€μ½ν λ΄λΆμμλ§ μ¬μ©μ΄ κ°λ₯νμ¬, μΈλΆ λ³μμ λ΄μ μ μμ
γγπ μ¦, κΈ°λ³Έμ μΌλ‘ νμΆ λΆκ°λ₯νλ€λ μμ±μ κ°μ§κ³ μμ
γγπ λν, ν¨μμ μΈμλ‘ μ λ¬λ ν΄λ‘μ λ ν΄λΉ ν¨μκ° λλκΈ° μ΄μ μ λ°λμ ν΄λΉ ν΄λ‘μ κ° μ€νλ¨
γγπ μ¦, ν΄λΉ ν¨μκ° λλκ² λλ©΄ μΈμλ‘ λμ΄κ° ν΄λ‘μ λ μ¬μ©μ΄ λΆκ°λ₯
π @escaping ν€μλλ₯Ό λΆμμΌλ‘μ¨, ν¨μκ° λ¦¬ν΄λ ν ν¨μμ μ€μ½ν λ°μμ ν΄λ‘μ λ₯Ό μ€νν μ μμ
π ν¨μκ° λ¦¬ν΄λ ν ν¨μμ μ€μ½ν λ°μμ ν΄λ‘μ λ₯Ό μ€νν μ μμ΄ λΉλκΈ° μμ
μ μ²λ¦¬ν λ μ¬μ©ν¨
π open
γγπ λͺ¨λ μΈλΆμμ access κ°λ₯
γγπ λͺ¨λ μΈλΆ μμκ³Ό override κ°λ₯
π public
γγπ λͺ¨λ μΈλΆμμ access κ°λ₯
γγπ λͺ¨λ μΈλΆ μμκ³Ό override λΆκ°λ₯
π internal(default κ°)
γγπ κ°μ λͺ¨λ μμμ access κ°λ₯
π fileprivate
γγπ κ°μ νμΌ μμμ access κ°λ₯
π private
γγπ κ°μ μ€μ½ν μμμ access κ°λ₯