[Swift] ê³µì 묞ì ì 늬 (14) - Initailization (ìì±ì, ìŽêž°ì, initìŽë?)
ìë íìžì, ê°ìì ëë€. Swift ì€í°ë륌 ì§ííë©Žì 4ìŒê° ê³µë¶íë.. ìì±ì ì±í°ë¥Œ ì ë¡ëíŽë³Œê²ì. ì ë§ êžžê³ êžžìŽì ì§ë£šíìŽì.. ê·Œë°ë ìì í ìŽíŽë ìì§ ëª»íë€ë ê²ìŽ íšì !! ë¹ ë¥Žê² íê³ ì§ëê°ëê² ëª©íììŽì ìì í ìŽíŽë íë€ìì§ë§, ì ìì±ìë ìŽëŽë ì¬ì©íë구ë ìŽëŽë ìëë구ë! ìŽë° Ʞ볞ì ìž ê°ë ì ë€ì§ë ìê°ìŽììŽì. ììŒë¡ ìì±ììëíŽì ë€ìíë² ì ë íë©Žì ê¶êží ì ì ëíŽì í¬ì€í íëë¡ íŽìŒê² ìŽì.
Swift Document chap.14 initialization ë°ë¡ê°êž°
Initialization — The Swift Programming Language (Swift 5.6)
Initialization Initialization is the process of preparing an instance of a class, structure, or enumeration for use. This process involves setting an initial value for each stored property on that instance and performing any other setup or initialization t
docs.swift.org
Initialization (ìì±ì)
Initialization(ìì±ì)ë íŽëì€, 구조첎, ìŽê±°íìì ìžì€íŽì€ë¥Œ ì€ë¹íêž° ìí 곌ì ìŽë€. ìŽë¬í 곌ì ì ìžì€íŽì€ì íë¡íŒí°ë€ë§ë€ ìŽêž°ê°ì ì€ì íŽì£Œê³ ì ìžì€íŽì€ë¥Œ ì¬ì©íêž° ì ì íìí ì€ì 곌 ìŽêž°í륌 ìííë 곌ì ìŽ í¬íšëë€.
ê°ê°ì íì ìì ìë¡ìŽ ìžì€íŽì€ë¥Œ ë§ë€ ì ìë í¹ìí ë©ìëì ê°ì ìí ì íë ìì±ì륌 ì ìíì¬ ì¬ì©í ì ìë€. Swiftììì ìì±ìë ê°ì ë°ííì§ ìëë€. ìì±ìì ê°ì¥ ì€ìí ìí ì ìë¡ìŽ ìžì€íŽì€ê° ì²ì ì¬ì©ëêž° ì ì ì¬ë°ë¥Žê² ìŽêž°í ëë ê²ì 볎ì¥íë ê²ìŽë€. íŽëì€ ìžì€íŽì€ë ìžì€íŽì€ë¥Œ ë©ëªšëŠ¬ìì ì ê±°íë deinitializer(ìë©žì)ë ì§ìíë€.
ì ì¥ íë¡íŒí°ë¥Œ ìí ìŽêž°ê° ì€ì
ìžì€íŽì€ì ì ì¥ íë¡íŒí°ë ì¬ì©íêž° ì ì ë°ëì í¹ì ê°ìŒë¡ ìŽêž°í ëìŽìŒ íë€. ìŽ ê°ìŒë¡ Ʞ볞ê°ì ì€ì í ì ìê³ , í¹ì ê°ì ì€ì í ìë ìë€.
Initializerìì ì ì¥ íë¡íŒí°ì ê°ì ì§ì ì€ì íë©Ž íë¡íŒí° ìµì ë²ê° ížì¶ëì§ ìê³ ê° í ë¹ìŽ ìíëë€.
ìŽëì ëŒìŽì (Initializers)
ìŽëì ëŒìŽì ë í¹ì íì ì ìžì€íŽì€ë¥Œ ìì±íë€. ìŽëì ëŒìŽì ì ê°ì¥ ê°ëší ííë íëŒë¯ží°ê° ìê³ init í€ìë륌 ì¬ì©íë ê²ìŽë€.
init() {
// perform some initialization here
}
ìì 륌 ìŽíŽë³Žì. íìš ìšë 구조첎륌 ë§ë€ìŽ ìšëëŒë íë¡íŒí°ë¥Œ ì ìžíê³ , ìŽëì ëŒìŽì ìì ìŽêž°ííë 구묞ìŽë€.
struct Fahrenheit {
var temperature: Double
init() {
temperature = 32.0
}
}
var f = Fahrenheit()
print("The default temperature is \\(f.temperature)° Fahrenheit")
// Prints "The default temperature is 32.0° Fahrenheit"
Ʞ볞 íë¡íŒí° (Defalut Property Values)
íë¡íŒí° ì ìžê³Œ ëìì ê°ì í ë¹íë©Ž ê·ž ê°ì ìŽêž° ê°ìŒë¡ ì¬ì©í ì ìë€.
â· note
íì ìŽêž°ê°ì ê°ëë€ë©Ž Ʞ볞 íë¡íŒí°ë¥Œ ì¬ì©íë ê²ìŽ ì¢ë€. íë¡íŒí°ì íì ì ì ìžíì§ ììë 컎íìŒë¬ë ìŽêž° ê°ì ì°žì¡°íŽì íì ì ì¶ë¡ í ì ìë€. ìŽ êž°ë³žê°ì ììì íšê» ììëë€.
struct Fahrenheit {
var temperature = 32.0
}
ì ìœëë íë¡íŒí° ì ìžê³Œ ëìì ìŽêž°ê°ì í ë¹í ìì ìŽë€.
Customizing Initialization
ìì±ìê° ìíëë ê²ì 맀ê°ë³ì, ìµì ë íë¡íŒí°, ìŽêž°í ì€ ìì íë¡íŒí°ë¥Œ ì§ì íì¬ ìì±ì륌 ìíëëë¡ ì ìí ì ìë€.
Initialization Parameters
ìì±ì륌 ì ìí ë íì 곌 맀ê°ë³ìì ìŽëŠì ê°ì§ê³ ìì±ì 맀ê°ë³ì륌 ë§ë€ ì ìë€. ìì±ì 맀ê°ë³ìë íšìì ë©ìëì 맀ê°ë³ìì ëìŒí 묞ë²ì ê°ì§ë€. ìì륌 ìŽíŽë³Žì.
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0
â· ìœë ì€ëª
- Celsius 구조첎ìë ìì±ìê° ë ê°
- ë ê°ì ìì±ìë ìë¡ ë€ë¥ž ìì±ì 맀ê°ë³ì륌 ê°ì§ê³ ìëë°, íŽë¹ ìì±ìì ë§ê² ìžì€íŽì€ë¥Œ ìì±íë©Ž íŽë¹ ìì±ìê° ížì¶
Parameter Names and Argument Labels
íšìì ë©ìëì 맀ê°ë³ìì ê°ìŽ ìì±ì ëŽë¶ìì ì¬ì©ë 맀ê°ë³ìë ìŽëŠê³Œ ìì±ì륌 ížì¶í ë ì¬ì©ë Argument Label (ìžì ë ìŽëž) ì ê°ì§ ì ìë€. íì§ë§ ìì±ìë ìŽëŠìŽ ìêž° ë묞ì 맀ê°ë³ìì ìŽëŠê³Œ íì ì ìì±ì륌 구ë¶íëë° ì€ìí ìí ì íë€. ìŽë¬í ìŽì ë¡ Swift ìì±ìë ê°ë°ìê° ë°ë¡ ìžì ë ìŽëžì ìì±íì§ ììŒë©Ž ìëì ìŒë¡ 몚ë 맀ê°ë³ìì ëíŽ ìžì ë ìŽëžì ì ê³µíë€.
ë€ì ìœëë ìŽêž°í ë íëŒë¯ží°ë¥Œ 3ê° ì ë ¥ë°ë ìŽëì ëŒìŽì ì íëë§ ì ë ¥ë°ë ìŽëì ëŒìŽì ì ìì ìŽë€.
struct Color {
let red, green, blue: Double
init(red: Double, green: Double, blue: Double) {
self.red = red
self.green = green
self.blue = blue
}
init(white: Double) {
red = white
green = white
blue = white
}
}
let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
let halfGray = Color(white: 0.5)
let veryGreen = Color(0.0, 1.0, 0.0)
// ERROR!!!! - ìžììŽëŠ ììšì ìë¬ê° ëš
// this reports a compile-time error - argument labels are required
ììì ì ìíëë¡ Colorìžì€íŽì€ë¥Œ ìžìê° 3ê° í¹ì íë륌 ìŽì©íŽ ìì±í ì ìë€. ìœë ë§ì§ë§ì€ììë, ìžììŽëŠì ìì±íì§ ììì ìë¬ê° ë°ìíë€.
Initializer Parameters Without Argument Labels
ìœë륌 ìì±í ë ìžì ë ìŽëžì ìëµíë ê²ìŽ ë ëª ë£í ê²œì° _ êž°ížë¥Œ ì¬ì©íŽ ìŽëì ëŒìŽì ìì ìžì ë ìŽëžì ìëµí ì ìë€. ë§ì§ë§ì ìì륌 ì ìžíë ëŒìžì 볎멎 ìžìë ìŽëž ììŽ ìžì€íŽì€ë¥Œ ìŽêž°í í ê²ì 볌 ì ìë€.
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
**init(_ celsius: Double) {
temperatureInCelsius = celsius
}**
}
let bodyTemperature = Celsius(37.0)
// bodyTemperature.temperatureInCelsius is 37.0
ìµì ë íë¡íŒí° íì
íë¡íŒí° ìµìŽ ê°ìŽ ìê³ ëì€ì ì¶ê°ë ì ìë ê°ì ìµì ëë¡ ì ìžíŽ ì¬ì©í ì ìë€. ìµì ë íë¡íŒí°ë ìëìŒë¡ nilë¡ ìŽêž°í ëë€.
class SurveyQuestion {
var text: String
**var response: String?**
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let cheeseQuestion = SurveyQuestion(text: "Do you like cheese?")
cheeseQuestion.ask()
// Prints "Do you like cheese?"
cheeseQuestion.response = "Yes, I do like cheese."
ìŽêž°í ì€ì ìì íë¡íŒí° í ë¹
ìŽëì ëŒìŽì ììë ìì íë¡íŒí°ì ê°ì í ë¹íë ê²ë ê°ë¥íë€. (ðð»íŽëì€ ìžì€íŽì€ìì ìì íë¡íŒí°ë ìŽêž°í ì€ ê·ž íŽëì€ ìììë§ ë³ê²œìŽ ê°ë¥íê³ ìëžíŽëì€ììë ë³ê²œìŽ ë¶ê°ë¥íë€)
class SurveyQuestion {
**let text: String**
var response: String?
init(text: String) {
self.text = text
}
func ask() {
print(text)
}
}
let beetsQuestion = SurveyQuestion(text: "How about beets?")
beetsQuestion.ask()
// Prints "How about beets?"
beetsQuestion.response = "I also like beets. (But not with cheese.)"
íë¡íŒí°ë¥Œ letìŒë¡ ì ìžíŽì ìŽ íë¡íŒí°ë ì²ìì ìŽêž°í ëë©Ž ë³ê²œëì§ ìë íë¡íŒí°ëŒë ê²ì ííí ì ìë€.
letìŒë¡ ì ìžëìêž° ë묞ì ë³ê²œìŽ ë¶ê°ë¥íë€ë ìë¬ê° ë°ìíë€.
Default Initializers (Ʞ볞 ìŽëì ëŒìŽì )
ë§ìœ 몚ë íë¡íŒí°ì ìŽêž°ê°ìŽ ì€ì ëŒ ìê³ , íëì ìŽêž°ìë ì ìíì§ ììë€ë©Ž, Swiftë 몚ë íë¡íŒí°ë¥Œ Ʞ볞 ê°ìŒë¡ ìŽêž°ííë Ʞ볞 ìì±ì륌 ì ê³µíë€.
ìë ìœëë ìŽëì ëŒìŽì 륌 ì ìíì§ ììë€ë©Ž Swiftê° ì ê³µíë Ʞ볞 ìŽëì ëŒìŽì ShoppingListItem()륌 ì¬ì©í ì ììì 볎ì¬ì£Œë ìì ìŽë€.
class ShoppingListItem {
var name: String?
var quantity = 1
var purchased = false
}
var item = ShoppingListItem()
구조첎 íì ì ë©€ë² ë³ ìì±ì (memberwise initializer)
구조첎ë ìì±ì륌 ì ìíì§ ììŒë©Ž memberwise initializer(ë©€ë² ë³ ìì±ì)륌 ìëìŒë¡ ë°ëë€. Default ìì±ììë ë€ë¥Žê² ì ì¥ íë¡íŒí°ì default ê°ìŽ ìì ë, memberwise initializer 륌 ë°ê²ëë€. memberwise initializerë ìë¡ìŽ 구조첎 ìžì€íŽì€ì íë¡íŒí°ë¥Œ ìŽêž°í íë ê°ëší ë°©ë²ìŽë€. ìë¡ìŽ ìžì€íŽì€ì íë¡íŒí°ì ëí ìŽêž° ê°ì, ìŽëŠìŒë¡ memberwise intitializerì ì ë¬íë€.
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)
ê° íì ì ìí Initializer Delegation
ìì±ìë ë€ë¥ž ìì±ì륌 ížì¶íì¬ ìžì€íŽì€ ìŽêž°íì ìŒë¶ë¥Œ ìíí ì ìë€. Initializer Delegation (ìì±ì ìì)ìŽëŒê³ íë ìŽë¬í 곌ì ì ìì±ììì ìœëê° ì€ë³µëë ê²ì ë°©ì§íë€.
ê°íì ìžì§ ì°žì¡°íì ìžì§ì ë°ëŒì Initialzier Delegation ì ìë ë°©ë²ìŽ ë¬ëŒì§ë€. ê°íì ìŠ êµ¬ì¡°ì²Žë ìŽê±°íììë ììì ì§ìíì§ ìëë€. ë°ëŒì ìŽë€ì Initializer delegationì ìì ìŽ ì ê³µíë ìì±ììê²ë§ ììí ì ìêž° ë묞ì êµ¬ì¡°ê° ê°ëšíë€. íì§ë§ íŽëì€ë ììí ì ìêž° ë묞ì ììíë 몚ë ì ì¥ íë¡íŒí°ê° ìŽêž°í ì€ì ì ì í ê°ìŽ í ë¹ëëë¡ íŽìŒíë€.
ê° íì ììë self.initìŒë¡ ìë¡ìŽ ìì±ì륌 ì ìí ë ë€ë¥ž ìì±ì륌 ì°žì¡°í ì ìë€. self.initì ìì±ì륌 ìì±í ëë§ ížì¶í ì ìë€. ê°íì , ìŠ êµ¬ì¡°ì²Žë ìŽê±°íìì ì¬ì©ì ì ì ìì±ì륌 ì ìíë©Ž defaultìì±ì륌 ëìŽì ì ê·Œí ì ìë€. ìŽë¬í ì ìœì ìì±ì륌 ë§ë€ìŽëì§ë§ ëêµ°ê°ê° ì¬ì©í ë ìŽë¥Œ ì¬ì©íì§ ìê³ êž°ë³žì ìŒë¡ ì ê³µëë ìì±ì륌 ì¬ì©íì¬ ë°ìíê² ëë ì€ë¥ë¥Œ ë°©ì§í ì ìë€. ìŽë¬í ì ìœìŽ ì«ê³ default ìì±ìë ì¬ì©íê³ ì¬ì©ì ì ì ìì±ìë ì¬ì©íê³ ì¶ë€ë©Ž ì¬ì©ì ì ì ìì±ì륌 extensionìŒë¡ ì ìžíë©Ž ëë€.
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
init() {}
init(origin: Point, size: Size) {
self.origin = origin
self.size = size
}
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
ì ìœëìì Rect 구조첎ìë ìž ê°ì ì¬ì©ì ì ì ìì±ìê° ì¡Žì¬íë€. ê·žëŠ¬ê³ ë ê°ì íë¡íŒí°ìž orgin, size ë ë€ë¥ž 구조첎 ìžì€íŽì€ íì ìžë° ìŽ íë¡íŒí°ë¥Œ ìŽêž°í íë ìì±ìì 맀ê°ë³ìì íŽë¹íë Size, Point 구조첎ë 몚ë default ê°ìŽ ìêž° ë묞ì ë€ì곌 ê°ìŽ ìž ê°ì§ ë°©ë²ìŒë¡ Rect 구조첎ì ìžì€íŽì€ë¥Œ ìì±í ì ìë€.
let basicRect = Rect()
// basicRect's origin is (0.0, 0.0) and its size is (0.0, 0.0)
let originRect = Rect(origin: Point(x: 2.0, y: 2.0),
size: Size(width: 5.0, height: 5.0))
// originRect's origin is (2.0, 2.0) and its size is (5.0, 5.0)
첫ë²ì§žì Rect() 겜ì°, init() ìì±ì륌 ì¬ì©í 겜ì°ìŽë€. default ìì±ì륌 ì¬ì©íë 겜ì°ì êž°ë¥ì ìŒë¡ ëìŒíë€.
ëë²ì§ž Rect(origin: Point: (x, y), size: Size(width, height))ì ê²œì° init(origin: size:) ìì±ì륌 ì¬ì©í 겜ì°ìŽê³ , Rect(center: Point(x, y), size: Size(width, height))ë init(center: size) ìì±ì륌 ì¬ì©í 겜ì°ìŽë€.
íŽëì€ ìì곌 ìì±ì
몚ë íŽëì€ì ì ì¥ íë¡íŒí°ì superclassë¡ë¶í° ììë°ì 몚ë íë¡íŒí°ë ìŽêž°í ëšê³ìì ë°ëì ìŽêž°ê°ìŽ í ë¹ëìŽìŒ íë€. Swiftììë íŽëì€ íì ìì 몚ë íë¡íŒí°ê° ìŽêž° ê°ì ê°ë ê²ì 볎ì¥íêž° ìíŽ 2ê°ì§ ë°©ë²ì ì§ìíë€.
ì§ì ìì±ìì ížì ìì±ì (Designated Initializers and Convenience Initializers)
Designated Initializers(ì§ì ìì±ì)ë íŽëì€ì Ʞ볞ì ìž ìì±ììŽë€. ì§ì ìì±ìë íŽëì€ì 몚ë íë¡íŒí°ë¥Œ ìŽêž°ííê³ ì ì í ìíŒ íŽëì€ì ìì±ìë ížì¶íì¬ ìíŒ íŽëì€ì íë¡íŒí°ë€ë ìŽêž°ííë€. íŽëì€ìë íëì ì§ì ìì±ìê° ìë ê²ìŽ ìŒë°ì ìŽë€. ì§ì ìì±ìê° ížì¶ëë ì§ì ì "funnel"ì§ì ìŒë¡ ìŽêž°í íë¡ìžì€ê° ìíŒ íŽëì€ ì²Žìžì ê³ìíë ì§ì ìŽë€.
몚ë íŽëì€ë ì ìŽë íëì ì§ì ìì±ìê° ììŽìŒíë€. ìŽë¬í ì구 ì¬íì 곧 ëì¬ Automatic Initializer Inheritanceì ì€ëª ë ëë¡ ìíŒ íŽëì€ìì íë ìŽìì ì§ì ìì±ì륌 ììíì¬ ì¶©ì¡±ëë€.
Convenience Initializers(ížì ìì±ì)ë íŽëì€ì ìì±ì륌 볎조íë ìí ì íë€. íŽëì€ì í¹ìí ìžì€íŽì€ë¥Œ ë§ë€ ë ì¬ì©íêž° ìíŽ ížì ìŽêž°í륌 ì ìí ìë ìë€. ë§ìœ ìŽë¬í ížì ìì±ìê° íìíì§ ìì ê²œì° êµ³ìŽ ì ê³µí íìë ìë€.
ì§ì ìì±ìì ížì ìì±ìì 묞ë²
íŽëì€ì ì§ì ìì±ìì 묞ë²ì ê° íì ìì±ìì ê°ë€.
init(parameters) {
statements
}
ížììì±ìë Ʞ볞 ìì±ìì 묞ë²ìŽ ê°ì§ë§ initìì convenience í€ìë륌 ë¶ìžë€.
convenience init(parameters) {
statements
}
íŽëì€ íì ì ìí ìì±ì ìì (Initializer Delegation)
ì§ì ìì±ìì ížì ìì±ìì êŽê³ë¥Œ ê°ëšíê² íêž° ìíŽ Swiftë ìì±ìì delegationì ë€ì ìž ê°ì§ ê·ì¹ì ì ì©íë€.
- RULE 1) ì§ì ìì±ìë ížì¶ ìŠì ìíŒ íŽëì€ì ì§ì ìì±ì륌 ížì¶íë€.
- RULE 2) ížì ìì±ìë ê°ì íŽëì€ ëŽì ë€ë¥ž ìì±ì륌 ížì¶íŽìŒ íë€.
- RULE 3) ížì ìì±ìë ì§ì ìì±ì륌 ížì¶íŽìŒë§ íë€.
ìŠ, designated initializerë íì delegate UP íŽìŒíê³ , Convenience initializerë íì delegate across íŽìŒíë€.
ì 귞늌ìì ìíŒíŽëì€ë íëì ì§ì ìì±ìì ë ê°ì ížì ìì±ì륌 ê°ì§ê³ ìë€. íëì ížì ìì±ìë ë€ë¥ž ížì ìì±ì륌 ížì¶íê³ , ë€ì íëì ì§ì ìì ì륌 ížì¶íë€. ìŽë ìì ê·ì¹ 2, 3ì ë§ì¡±íë€. ìíŒíŽëì€ ì첎ìë ì¶ê° ìíŒ íŽëì€ê° ìêž° ë묞ì ê·ì¹ 1ì ì ì©ëì§ ìëë€.
ìì 귞늌ìì ìëžíŽëì€ë ë ê°ì ì§ì ìì±ìì íëì ížì ìì±ìê° ìë€. ížì ìì±ìë ëìŒí íŽëì€ ìì±ìë§ ížì¶ í ì ìêž° ë묞ì, ì§ì ìì±ìë§ ížì¶ ê°ë¥íë€. ëšì ì§ì ìì±ìë€ì ê·ì¹ 1ì ìíŽ ìíŒíŽëì€ì ì§ì ìì±ì륌 ížì¶íŽìŒ íêž° ë묞ì ê·žë ê² ížì¶íê³ ììì 볌 ì ìë€. ìŽë ê² ê·ì¹ 1,2,3 ì 몚ë ì€ìíê³ ìë€.
ìŽë¬í ê·ì¹ì íŽëì€ë¥Œ ì¬ì©í ë íŽëì€ì ìžì€íŽì€ë¥Œ ë§ëë ë°©ë²ìë ìí¥ì ëŒì¹ì§ ìëë€. ì€ë¡ì§ íŽëì€ì ìì±ì 구íì ìì±íë ë°©ë²ìë§ ìí¥ì 죌ë ê·ì¹ë€ìŽë€.
ë€ìì ì¢ ë ë³µì¡í ìì±ì ììì ííìŽë€.
- ì 귞늌ììë 몚ë ìëžíŽëì€ì designated initializerê° ëªšë ìíŒíŽëì€ì designated initalizer 륌 ížì¶íê³ ììì 볌 ì ìë€. (delegate UP)
- ë 몚ë Convenience initializerë ë€ë¥ž initializer륌 ížì¶íê³ ììì 볌 ì ìë€. (delegate Across)
Two-Phase Initialization (2ëšê³ ìì±ì)
Swiftìì íŽëì€ ìŽêž°íë 2ëšê³ì ê±°ì³ ì§íëë€. 첫ë²ì§ž ëšê³ììë ì ì¥ íë¡íŒí°ì íŽëì€ì ìí ìŽêž°ê°ìŽ í ë¹ëë€. 몚ë ì ì¥ íë¡íŒí°ì ìŽêž° ê°ìŽ ê²°ì ëë©Ž ë ë²ì§ž ëšê³ê° ììëëë°, ìŽ ëšê³ììë ìë¡ìŽ ìžì€íŽì€ê° ìì±ëêž° ì ì ì ì¥ íë¡íŒí°ì ê°ì ë°ê¿ ì ìë êž°íê° ì£ŒìŽì§ë€. ìŽë¬í ë ëšê³ì ê±žì¹ íë¡ìžì€ë¥Œ ì¬ì©íë©Ž íŽëì€ ê³ìžµ 구조ì ê° íŽëì€ë ìì í ì ì°ì±ì ê°ê² ëë€. ìŽë¬í ëšê³ë íë¡íŒí°ì ê°ìŽ í ë¹ëêž° ì ìë íë¡íŒí° ê°ì ì ê·Œíì§ ëª»íê² íê³ ë€ë¥ž ìì±ìê° íë¡íŒí° ê°ì ë€ë¥ž ê°ìŒë¡ ì€ì íì§ ëª»íê² íë€.
Swift 컎íìŒë¬ë ë€ ê°ì§ì ìì ì ê²ì ìííì¬ 2ëšê³ ìŽêž°íê° ìë£ëìëì§ íìžíë€.
- ìì ì ê² 1) Designated ìì±ìë ìíŒ íŽëì€ì ìì±ìê° ì€íëêž° ì ì íŽë¹ íŽëì€ì 몚ë íë¡íŒí°ì ê°ì í ë¹íŽìŒ íë€. ê°ì²Žì ë©ëªšëŠ¬ë 몚ë íë¡íŒí°ì ê°ìŽ ìì ëë§ ìì í ìŽêž°í ë ê²ìŒë¡ ê°ì£Œíë€. ìŽë¬í ê·ì¹ì ë§ì¡±íë €ë©Ž ìíŒ íŽëì€ì ìì±ìê° ì€íëêž° ì ì íì¬ ìì± ì€ìž íŽëì€ì 몚ë íë¡íŒí°ì ê°ì í ë¹íŽìŒíë€.
- ìì ì ê² 2) Designated ìì±ìë ììë íë¡íŒí°ì ê°ì í ë¹íê³ ì¶ë€ë©Ž ìíŒ íŽëì€ì ìì±ì륌 ì€íí ë€ì ê°ì í ë¹íŽìŒíë€. ê·žë ì§ ììŒë©Ž ìíŒ íŽëì€ì ìì±ìì ìíŽ ê°ìŽ ë®ìŽììì§ë€.
- ìì ì ê² 3) Convenience ìì±ìë íë¡íŒí°ì ê°ì í ë¹íêž° ì ì ë€ë¥ž ìì±ì륌 ì€ííŽìŒ íë€. ê·žë ì§ ììŒë©Ž ì첎 íŽëì€ì ìì±ìì ìíŽ ê°ìŽ ë®ìŽììì§ë€.
- ìì ì ê² 4) ìì±ìë ìŽêž°íì 첫 ë²ì§ž ëšê³ê° ìë£ë ëê¹ì§ ìžì€íŽì€ ë©ìë, ìžì€íŽì€ íë¡íŒí°, self륌 ì¬ì©í ì ìë€.
íŽëì€ì ìžì€íŽì€ë 첫 ë²ì§ž ëšê³ê° ëë ëê¹ì§ë ì íší ê°ì²Žê° ìëë€. ìŠ ì²« ë²ì§ž ëšê³ë¥Œ ìë£íŽìŒì§ íë¡íŒí°ì ì ê·Œíê±°ë ë©ìë륌 ížì¶í ì ìë€. ìì ë€ ê°ì§ ìì ì ê²ì ìíŽ 2 ëšê³ ìŽêž°íê° ìíëë ë°©ìì ë€ì곌 ê°ë€.
- 1 ëšê³
- íŽëì€ìì Designated, convenience ìì±ì륌 ížì¶íë€.
- íŽëì€ì ì ìžì€íŽì€ì ë©ëªšëŠ¬ê° í ë¹ëë€. íì§ë§ ìì§ ë©ëªšëŠ¬ê° ìŽêž°íë ê²ì ìëë€.
- Designated ìì±ìë íŽë¹ íŽëì€ì ëí 몚ë íë¡íŒí°ì ê°ìŽ ììì íìžíë€. ìŽì ì ì¥ íë¡íŒí°ì ë©ëªšëŠ¬ê° ìŽêž°íëìë€.
- ìíŒ íŽëì€ì ìì±ì륌 ì€ííë€.
- ìµìì íŽëì€ì ëë¬í ë ê¹ì§ ê³ìíë€.
- ìµìì íŽëì€ì ëë¬í ë€ ìµìì íŽëì€ì 몚ë íë¡íŒí°ì ê°ìŽ ìëì§ íìžíë©Ž ìžì€íŽì€ì ë©ëªšëŠ¬ê° ìì í ìŽêž°íë ê²ìŒë¡ ë³Žê³ 1ëšê³ë¥Œ ì¢ ë£íë€.
- 2ëšê³
- ìµìì íŽëì€ìì ë€ì ëŽë €ê°ë©Žì íŽëì€ì ì ìë designated ìì±ìë ìžì€íŽì€ì ê°ì ë€ì ì§ì í ì ìë ìµì ìŽ ìë€. ìŽë¬í ìì±ìë ìŽì ìì ì íë¡íŒí°ì ì ê·ŒìŽ ê°ë¥íë©° ìžì€íŽì€ ë©ìëë ížì¶í ì ìë€. ëí íŽëì€ë€ì conveniecne ìì±ìë ìžì€íŽì€ë¥Œ 컀ì€í°ë§ìŽì§íê³ ì첎ì ìŒë¡ ìì ì ìíí ì ìë€.
ì 귞늌ì 1ëšê³ìì ìëžíŽëì€ ë° ìíŒíŽëì€ì ìì±ì륌 ì°Ÿë ë°©ë²ìŽë€.
ìŽêž°íë ìëžíŽëì€ì convenience ìì±ìì ížì¶ìì ììëë€. ìì§ convenience ìì±ìë íë¡íŒí°ë¥Œ ìì í ì ììŒë¯ë¡ ëìŒí íŽëì€ì designated ìì±ì륌 ì€íìíšë€. Designated ìì±ìë ìì ì ê² 1 ì ë°ëŒ ìëžíŽëì€ì íë¡íŒí°ì ê°ìŽ ìëì§ íìží ë€ ìíŒíŽëì€ì designated ìì±ì륌 ížì¶íë€. ìíŒíŽëì€ì designated ìì±ìë ìíŒíŽëì€ì íë¡íŒí°ì ê°ìŽ ìëì§ íìžíê³ ë ìŽìì ìíŒíŽëì€ê° ìêž° ë묞ì ë©ëªšëŠ¬ë ìì í ìŽêž°í ë ê²ìŒë¡ ê°ì£Œëê³ 1ëšê³ê° ì¢ ë£ëë€.
ì 귞늌ì ìŽêž°íì 2ëšê³ ìŽë€.
ìŽì ìíŒíŽëì€ì designated ìì±ìë ìžì€íŽì€ë¥Œ 컀ì€í°ë§ìŽì§ í ì ìë€. ìíŒíŽëì€ì designated ìì±ìê° ìë£ëë©Ž ìëžíŽëì€ì designated ìì±ìê° ì»€ì€í°ë§ìŽì§ì ìííê³ ê·ž íì convenience ìì±ìê° ì¶ê°ì ìž ì»€ì€í°ë§ìŽì§ì ìíí ì ìê² ëë€.
ìŽëì ëŒìŽì ì ìì곌 ì€ë²ëŒìŽë©
Swift ìëžíŽëì€ë Ʞ볞ì ìŒë¡ ìíŒíŽëì€ì ìì±ì륌 ììíì§ ìëë€. ìŽì ë ìíŒíŽëì€ì ìŽëì ëŒìŽì ê° ë¬Žë¶ë³íê² ììëìŽ ë³µì¡íê² ëŒ ìëžíŽëì€ìì ìŽê²ë€ìŽ ì못 ìŽêž°í ëë ê²ì ë§êž° ìíšìŽë€. ìíŒíŽëì€ì ìŽëì ëŒìŽì ë ìì íê³ ì ë¹í í¹ì í겜ìì ììëë€.
ë§ìœ íŽëì€ìì 몚ë íë¡íŒí°ì ìŽêž° ê°ìŽ ì§ì ëŒ ìê³ , ìë¬Žë° ì»€ì€í ìì±ì륌 ì ìžíì§ ìëë€ë©Ž, Ʞ볞 ìì±ì init()ì ì¬ì©í ì ìë€.
ìíŒíŽëì€ì ìì±ì륌 ì€ë²ëŒìŽë íêž° ìíŽìë ìëžíŽëì€ìì ê·ž ìì±ìì override í€ìë륌 ë¶ìŽê³ ì¬ì ìíë€.
ë€ì ìì ë íŽëì€ë¥Œ ìì±íê³ ê·žê²ì ìëžíŽëì€ìì ìì±ì륌 ì€ë²ëŒìŽë íŽ ì¬ì©í ìì ìŽë€.
class Vehicle {
var numberOfWheels = 0
var description: String {
return "\\(numberOfWheels) wheel(s)"
}
}
let vehicle = Vehicle()
print("Vehicle: \\(vehicle.description)")
// Vehicle: 0 wheel(s)
ì ìœëë VehicleíŽëì€ë¥Œ ì ìíê³ numberOfWheels ëŒë ì ì¥ íë¡íŒí°ë¥Œ ì ìžíë€. ìŽë description ìŽëŒë ê³ì° íë¡íŒí°ìì 묞ììŽì ë§ëëë° ì¬ì©ëë€. ì¬êž°ì VehicleíŽëì€ë ì ì¥ íë¡íŒí°ì default ê°ì í ë¹íê³ , ë°ë¡ ìì±ì륌 ìì±íì§ ììë€. 결곌ì ìŒë¡ ìŽë default ìì±ì륌 ì¬ì©íê² ëìŽ ìŽë¬í default ìì±ìë íŽëì€ìì íì designated ìì±ììŽë€.
class Bicycle: Vehicle {
override init() {
super.init()
numberOfWheels = 2
}
}
let bicycle = Bicycle()
print("Bicycle: \\(bicycle.description)")
// Bicycle: 2 wheel(s)
ìŽë²ìë Vehicle íŽëì€ë¥Œ ììë°ë Bicycle íŽëì€ë¥Œ ì ìíë€. Bicycle íŽëì€ìë designated ìì±ììž init()ì ì ìíŽì£Œìë€. ìŽ ìì±ìë ìíŒíŽëì€ìž Vehicleìë ììŒë¯ë¡ override í€ìë륌 ìì ìšì ìëžíŽëì€ìì ì€ë²ëŒìŽë íë€ë ê²ì êŒ ëª ìíŽìŒ íë€.
ê·žëŒ ìŽì Bicycleì init()ì ìŽíŽë³Žì. ìŽ ìì±ìë super.init(), ìŠ Vehicleì ìì±ì륌 ížì¶íê³ ìë€. Vehicleì ìì±ìë numberOfWheels íë¡íŒí°ì ê°ì 0ìŒë¡ ìŽêž°ííë ìì±ììì§ë§, Bicycle íŽëì€ì init()ìì ë€ì ìŽë¥Œ 2ë¡ ë°êŸžìŽ ì£Œê² ëë€. ë§ìœ ìŽë¬í ëììì ìëžíŽëì€ì ìì±ìê° ìŽêž°í íë¡ìžì€ì 2ëšê³ìì 컀ì€í ìì±ìê° ìê³ , ìíŒ íŽëì€ì designated ìì±ìì 맀ê°ë³ìê° ìì ë ìëž íŽëì€ì ì ì¥ íë¡íŒí°ì ê°ì í ë¹í íì super.init()ížì¶ì ìëµí ìë ìë€.
class Hoverboard: Vehicle {
var color: String
init(color: String) {
self.color = color
// super.init() implicitly called here
}
override var description: String {
return "\\(super.description) in a beautiful \\(color)"
}
}
let hoverboard = Hoverboard(color: "silver")
print("Hoverboard: \\(hoverboard.description)")
// Hoverboard: 0 wheel(s) in a beautiful silver
ì ìœëë HoverboardëŒë ìë¡ìŽ Vehicleì ìëžíŽëì€ë¥Œ ì ìí ê²ìŽë€. Hoverboard íŽëì€ì ìì±ìë color íë¡íŒí°ë§ ìŽêž°ííë€. ìŽ ìì±ìë super.init()ì ììì ìŒë¡ ížì¶íì¬ ìŽêž°í íë¡ìžì€ë¥Œ ìë£íë€. íë ë§ ë¶ìŽìë©Ž ìëž íŽëì€ë ììë ë³ì íë¡íŒí°ì ê°ì ìì í ì ìì§ë§ ììë ìì íë¡íŒí°ì ê°ì ìì í ì ìë€.
ìë ìì±ì ìžì€íŽì€
ììì ìžêžíë¯ìŽ, ìëžíŽëì€ë Ʞ볞ì ìŒë¡ ìíŒíŽëì€ì ìì±ì륌 ììíì§ ìëë€. íì§ë§ í¹ì 조걎ììë ìíŒíŽëì€ì ìì±ìê° ìëìŒë¡ ììëë€. ìŽë¬í êž°ë¥ì í¹ì 조걎ìì ìíŒ íŽëì€ì ìì±ì륌 ììí ì ìë€ë ê²ì ì믞íë€.
ìëžíŽëì€ì ì ìí ìë¡ìŽ íë¡íŒí°ì default ê°ì ì ê³µíë€ê³ ê°ì íë©Ž ë€ì ë ê°ì§ì ê·ì¹ìŽ ì ì©ëë€.
- Rule 1
- ìëž íŽëì€ê° designated ìì±ì륌 ì ìíì§ ììŒë©Ž ìëì ìŒë¡ ìíŒ íŽëì€ì designated ìì±ì륌 몚ë ììë°ëë€.
- Rule 2
- ìëž íŽëì€ê° Rule 1ì ë°ëŒ ììíê±°ë ìíŒ íŽëì€ì 몚ë designated ìì±ì륌 ì€ë²ëŒìŽë íŽì 구ííë©Ž ìíŒ íŽëì€ì convenience ìì±ìë ìëìŒë¡ ììë°ëë€. ìŽë¬í ê·ì¹ì ìëž íŽëì€ì convenience ìì±ì륌 ì¶ê°íë 겜ì°ìë ì ì©ëë€.
ì§ì ìì±ì(Designated)ì ížì ìì±ìì(convenience) ì¬ì©
ê·žëŒ designated ìì±ì, Convenience ìì±ì, Automatic ìì±ìì ìììŽ ëìíë 몚ìµì ìŽíŽë³Žì.
class Food {
var name: String
init(name: String) {
self.name = name
}
convenience init() {
self.init(name: "[Unnamed]")
}
}
ížììŽêž°ì convenience.init() ìì ì§ì ìŽêž°ì init(name: String)ìŽ ížì¶ëë ííìŽë€.
ì°ì ìíŒíŽëì€ Food ëŒë íŽëì€ë¥Œ ì ìíë€. ìŽë ìíì íëŠì 캡ìííë íŽëì€ìŽê³ , 2ê°ì ìì±ìê° ì¡Žì¬íë€.
ì 귞늌ì Food íŽëì€ì ìì±ìì êŽê³ë¥Œ ëíëž ê²ìŽë€. Food íŽëì€ìë default memberwise ìì±ìê° ìêž° ë묞ì designated ìì±ììž init(name: )륌 ì ê³µíë€.
let namedMeat = Food(name: "Bacon")
// namedMeat's name is "Bacon"
let mysteryMeat = Food()
// mysteryMeat's name is "[Unnamed]"
init(name: )ìì±ì륌 ì¬ì©íŽì Food íŽëì€ì ìë¡ìŽ ìžì€íŽì€ë¥Œ ìì±í ì ìë€. Foodìë ìžì ììŽ ì¬ì©ê°ë¥í ìì±ììž init() ë ì ìëìŽ ìê³ , ìŽë¥Œ íµíŽìë ìë¡ìŽ ìžì€íŽì€ë¥Œ ë§ë€ ì ìë€.
ê·žëŒ ìŽì Food ì ìëžíŽëì€ë¥Œ ì ìíŽë³Žì.
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
let oneMysteryItem = RecipeIngredient()
let oneBacon = RecipeIngredient(name: "Bacon")
let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6)
RecipeIngredient íŽëì€ëŒë ìëžíŽëì€ë¥Œ ë§ë€ìë€. ìŽë quantityëŒë ì ì¥íë¡íŒí°ê° ìë¡ ì ìëìŽìê³ , ìì±ìë 2ê°ê° ì¡Žì¬íë€.
ìì 귞늌ì RecipeIngredient íŽëì€ì ìì±ìë€ì êŽê³ë¥Œ ëíëž ê·žëŠŒìŽë€. RecipeIngredient íŽëì€ìë init(name: quantity:)ëŒë designated ìì±ìê° ìê³ ìŽ ìì±ìì ìíŽ ìë¡ ì ìë íë¡íŒí°ì ê°ì í ë¹íë€.
ê·žëŠ¬ê³ super.init(name:)ì ížì¶íê² ëë©° 2ëšê³ ìŽêž°íì ìì ì ê² 1ì ë§ì¡±íê² ëë€. RecipeIngredient íŽëì€ë convenience ìì±ììž init(name:String)ë¡ ì ìëìŽìëë° ìŽë¥Œ íµíŽ ìžì€íŽì€ë¥Œ ë ìœê² ë§ë€ ì ìê² ëë€. íì§ë§ ìŽ ìì±ìë ìíŒ íŽëì€ìž Foodììë ëìŒí 맀ê°ë³ì륌 ê°ë ìì±ìê° ì ìëìŽ ìêž° ë묞ì override륌 ìì ìšì€ìŒ íë€.
RecipeIngredientë convenience ìì±ìë¡ init(name:)ì ì ê³µíì§ë§ ìíŒíŽëì€ì designated ìì±ì륌 몚ë ì ê³µíìŒë¯ë¡ Food íŽëì€ì convenience ìì±ìë 몚ë ììë°ê² ëë€. ìŠ Foodì init() ìì±ì륌 ììë°ê² ëë ê²ìŽë€.
class ShoppingListItem: RecipeIngredient {
var purchased = false
var description: String {
var output = "\\(quantity) x \\(name)"
output += purchased ? " â" : " â"
return output
}
}
var breakfastList = [
ShoppingListItem(),
ShoppingListItem(name: "Bacon"),
ShoppingListItem(name: "Eggs", quantity: 6),
]
breakfastList[0].name = "Orange juice"
breakfastList[0].purchased = true
for item in breakfastList {
print(item.description)
}
// 1 x Orange juice â
// 1 x Bacon â
// 6 x Eggs â
ìŽë²ì RecipeIngredient íŽëì€ë¥Œ ììë°ë ShoppingListItem íŽëì€ë¥Œ ì ìíŽë³Žìë€. ìŽ íŽëì€ìë ì ì¥ íë¡íŒí° purchasedì ê³ì° íë¡íŒí°ìž descriptionìŽ ì ìëìŽìë€. 몚ë íë¡íŒí°ì ê°ìŽ í ë¹ëìŽ ìêž° ë묞ì ë°ë¡ ìì±ì륌 ì ìíì§ ììë 묞ì ê° ìë ê²ì ì ì ìë€. ShoppingListItem íŽëì€ë 몚ë íë¡íŒí°ì ê°ì ì ê³µíê³ ìì±ì ì첎륌 ì ìíì§ ììêž° ë묞ì ìíŒíŽëì€ìì ì ìë 몚ë ìì±ì륌 ììë°ëë€. ë°ëŒì ìì ìœëì²ëŒ ShoppingListItemì ìžì€íŽì€ë€ì ë§ë€ ì ìë€.
ì 귞늌ì ì§êžê¹ì§ ì ì ìž íŽëì€ì ìì±ì êŽê³ë¥Œ 볎ì¬ì€ë€.
Failable Initializers (ì€íš ê°ë¥í ìì±ì)
ìŽêž°í 곌ì ì€ì ì€íší ê°ë¥ì±ìŽ ìë ìì±ì륌 init ë€ì 묌ìí(?) 륌 ì¬ì©íŽ ì€íš ê°ë¥í ìì±ìëŒê³ ííí ì ìë€.
ìì±ìë ìŽëŠìŽ ë°ë¡ ìë ê²ìŽ ìëëŒ íëŒë¯ží°ë¡ 구ë¶íêž° ë묞ì ì€íšê°ë¥í ìì±ìì ì€íš ë¶ê°ë¥í ìì±ì륌 ê°ì íëŒë¯ží° íì 곌 ìŽëŠìŒë¡ ëìì ì¬ì©í ì ìë€. ì€íš ê°ë¥í ìì±ìë ë°íê°ìŒë¡ ìµì ë ê°ì ìì±íë€. ìŽêž°íì ì€íšíë ë¶ë¶ìì nilì ë°ííë ìœë륌 ìì±íŽ ìŽêž°íê° ì€íšíë€ë ê²ì ëíëŒ ì ìë€.
ìì°í ë§íë©Ž ìì±ì initì ê°ì ë°ííì§ ìëë€. ê·žëì ë¹ë¡ nilì ë°ííë return nil ìœëìë ì¬ì©íì§ë§ initìŽ ì¬ì©íë ê²œì° return í€ìë륌 ì¬ì©íì§ ìëë€.
ë€ì ìœëë ì«ìíì ìíŽ ì ìëŒ ìë ì€íš ê°ë¥í ìì±ì Int(exactly: )륌 ì¬ì©í ìì ìŽë€.
let wholeNumber: Double = 12345.0
let pi = 3.14159
if let valueMaintained = Int(exactly: wholeNumber) {
print("\\(wholeNumber) conversion to Int maintains value of \\(valueMaintained)")
}
// Prints "12345.0 conversion to Int maintains value of 12345"
let valueChanged = Int(exactly: pi)
// valueChanged is of type Int?, not Int
if valueChanged == nil {
print("\\(pi) conversion to Int does not maintain value")
}
// Prints "3.14159 conversion to Int does not maintain value"
ì ìœëì ê°ìŽ ì«ì íì ê° ë³íìì ê°ì ì ííê² ì ì§íë €ë©Ž init(exactly: ) ìì±ì륌 ì¬ì©íë©Ž ëë€. ë§ìœ ë³í í ê°ì ì ì§í ì ìë€ë©Ž, ìì±ìê° ì€íšíê² ëë€. ìŠ ììŒ ìœëìì 12345.0ì Intë¡ ë³ííŽë ê°ìŽ ì ì§ëêž° ë묞ì ìŽë ê°ìŽ ì ì§ëêž° ë묞ì ìŽë ê°ìŽ ì ìŽêž°í ëì§ë§, 3.14159륌 Int ë¡ ë³ííë©Ž 3ìžë° ìŽë ê°ìŽ ì ì§ëì§ ììŒë¯ë¡ ìŽêž°íì ì€íšíê² ëë€.
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty { return nil }
self.species = species
}
}
let someCreature = Animal(species: "Giraffe")
// someCreature is of type Animal?, not Animal
if let giraffe = someCreature {
print("An animal was initialized with a species of \\(giraffe.species)")
}
// Prints "An animal was initialized with a species of Giraffe"
let anonymousCreature = Animal(species: "")
// anonymousCreature is of type Animal?, not Animal
if anonymousCreature == nil {
print("The anonymous creature couldn't be initialized")
}
// Prints "The anonymous creature couldn't be initialized"
ì ìœëììë Animal 구조첎륌 ì ìíê³ init? ìŽëŒë ì€íšê°ë¥í ìì±ì륌 ì ìíë€.ìŽ ìì±ìë ë§ìœ ë¹ ë¬žììŽìŽ 맀ê°ë³ìë¡ ë€ìŽì€ë©Ž ìŽêž°í륌 ì€íšíê² ëëë¡ ì ìëìŽ ìë€. ì€ì ë¡ ìžì€íŽì€ë¥Œ ë§ë€ìŽë³Žë©Ž ë¹ ë¬žììŽì ìì±ìì 맀ê°ë³ìë¡ ì ë ¥íê² ëë©Ž ìŽêž°íì ì€íšíê² ëë€.
ìŽê±°íìì ì¬ì©íë Failable ìì±ì
ìŽê±°íììë ì€íšê°ë¥í ìì±ì륌 ì¬ì©í ì ìë€. ìì 륌 볎ì.
enum TemperatureUnit {
case kelvin, celsius, fahrenheit
init?(symbol: Character) {
switch symbol {
case "K":
self = .kelvin
case "C":
self = .celsius
case "F":
self = .fahrenheit
default:
return nil
}
}
}
let fahrenheitUnit = TemperatureUnit(symbol: "F")
if fahrenheitUnit != nil {
print("This is a defined temperature unit, so initialization succeeded.")
}
// Prints "This is a defined temperature unit, so initialization succeeded."
let unknownUnit = TemperatureUnit(symbol: "X")
if unknownUnit == nil {
print("This is not a defined temperature unit, so initialization failed.")
}
// Prints "This is not a defined temperature unit, so initialization failed."
ì ìœëììë ìŽêž°í ì ì§ì ë í¹ì ìšë íì ëšìê° ìë ê²œì° ìŽêž°í ê²°ê³Œë¡ nilì ë°ííë€. Temperatureunit(symbol: “F”) ìì Fë TempertureUnit ìŽê±°íìì ì¬ì ì ì ìëìŽ ìë ëšìì¬ì ìŽêž°íê° ì ìì ìŒë¡ ëìíë€.
íì§ë§ TemperatureUnit(symbol: "X")ìì Xë ì ìëì§ ìì ëšìì¬ì ìŽêž°íì ì€íšíê² ëë ê²ì 볌 ì ìë€.
Raw ê°ì ì¬ì©íë ìŽê±°íììì Failable ìì±ì
ìŽê±°íì ê° ìŒìŽì€ì ì§ì ëŒ ìë Raw ê°ì ìì±ì ìžìë¡ ë£ìŽ ìŽêž°íì ì¬ì©í ì ìë€.
enum TemperatureUnit: Character {
case kelvin = "K", celsius = "C", fahrenheit = "F"
}
let fahrenheitUnit = TemperatureUnit(rawValue: "F")
if fahrenheitUnit != nil {
print("This is a defined temperature unit, so initialization succeeded.")
}
// Prints "This is a defined temperature unit, so initialization succeeded."
let unknownUnit = TemperatureUnit(rawValue: "X")
if unknownUnit == nil {
print("This is not a defined temperature unit, so initialization failed.")
}
// Prints "This is not a defined temperature unit, so initialization failed."
ëìì ìì TempertureUnit 곌 ê°ë€. íì§ë§ TempertureUnitììì ìì±ì 구íìŽ íšì¬ ê°ëšíŽì¡ë€.
ìì ìœëë ìì ê°ì ê°ë TemperatureUnit ìŽê±°íì ì ìí ê²ìŽë€. ë°ë¡ ìì±ì륌 ì ìíì§ ììì§ë§ ìëì ìŒë¡ init?(rawValue:)ê° ìì±ëìŽ ì¬ì©í ì ìë ê²ì 볌 ì ìë€.
ìì±ì ì€íš ì ë¬(ìì)
íŽëì€, 구조첎, ìŽê±°íì ì€íšê°ë¥í ìì±ìë ê°ì íŽëì€, 구조첎, ìŽê±°íì ì€íšê°ë¥í ìì±ìì ììí ì ìë€. ë¹ì·íê² ìëžíŽëì€ì ì€íšê°ë¥í ìì±ìë ìíŒíŽëì€ì ì€íšê°ë¥í ìì±ì륌 ììí ì ìë€. ìŽë¬í 겜ì°ì ìì±ìê° ì€íšíê² ëë©Ž ì 첎 ìì±ì íë¡ìžì€ê° ì€íšíê³ ë ìŽì ìœëê° ì€íëì§ ìëë€.
ì€íšê°ë¥í ìì±ìë ì€íší ì ìë ìì±ì륌 ììí ì ìë€. ìŽë° 겜ì°ìë ë€ì곌 ê°ì ë°©ë²ì ì¬ì©íë©Ž ëë€.
class Product {
let name: String
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
class CartItem: Product {
let quantity: Int
init?(name: String, quantity: Int) {
if quantity < 1 { return nil }
self.quantity = quantity
super.init(name: name)
}
}
ì ìœëë Product íŽëì€ì ìŽë¥Œ ììë°ë CartItem íŽëì€ë¥Œ ì ìí ìœëìŽë€. ë íŽëì€ìë 몚ë ì€íšê°ë¥í ìì±ìê° ì ìëìŽìë€. CartItemíŽëì€ì ìì±ìë 맀ê°ë³ìë¡ ë°ë quantityì ê°ìŽ 1ë³Žë€ ììŒë©Ž ìŽêž°íì ì€íšíê² ëìŽ ë ìŽì ìœëê° ì€íëì§ ìëë€. ë§ì°¬ê°ì§ë¡ Product íŽëì€ì ìì±ìë nameì ë¹ ë¬žììŽìŽ ì ë ¥ëë€ë©Ž 몚ë ìŽêž°í íë¡ìžì€ê° ì€íšíê² ëë€.
if let twoSocks = CartItem(name: "sock", quantity: 2) {
print("Item: \\(twoSocks.name), quantity: \\(twoSocks.quantity)")
}
// Prints "Item: sock, quantity: 2"
ì ìœëë nameë ìê³ , quantityë 1ìŽììŽë¯ë¡ ìžì€íŽì€ ìì±ì ì±ê³µíë€.
if let zeroShirts = CartItem(name: "shirt", quantity: 0) {
print("Item: \\(zeroShirts.name), quantity: \\(zeroShirts.quantity)")
} else {
print("Unable to initialize zero shirts")
}
// Prints "Unable to initialize zero shirts"
ì ìœëë ìžì€íŽì€ ìì±ì quantityê° 0ìŽë¯ë¡ ìžì€íŽì€ ìŽêž°íì ì€íšíë€.
if let oneUnnamed = CartItem(name: "", quantity: 1) {
print("Item: \\(oneUnnamed.name), quantity: \\(oneUnnamed.quantity)")
} else {
print("Unable to initialize one unnamed product")
}
// Prints "Unable to initialize one unnamed product"
ì ìœëë quantityë 1 ìŽììŽì§ë§, nameìŽ ë¹ìŽìêž° ë묞ì ìŽêž°íì ì€íšíë€.
Failable ìì±ìì ì€ë²ëŒìŽë©
ìíŒíŽëì€ì ì€íšê°ë¥í ìì±ì륌 ìëžíŽëì€ìì ì€íšë¶ê°ë¥í ìì±ìë¡ ì€ë²ëŒìŽë© í ì ìë€. ìŽ ë°©ë²ì ìŽì©íŽ ì€íšë¶ê°ë¥í ìì±ì륌 ìì± ê°ë¥íë€.
ì€íšê°ë¥í ìì±ì륌 ì€íšë¶ê°ë¥í ìì±ììì ì€ë²ëŒìŽë í ì ìì§ë§, ê·ž ë°ëë ë¶ê°ë¥ íë€.
ìë Document íŽëì€ë ìŽêž°í륌 í ë, name ê°ìŒë¡ í¹ì Stringì ì§ì íê±°ë nilì ì§ì í ì ìë€. íì§ë§ nameìŽ ë¹ìŽìë 겜ì°ìë ìŽêž°í ì€íšë¥Œ ëíëŽë nilì ë°ííë€.
class Document {
var name: String?
// this initializer creates a document with a nil name value
init() {}
// this initializer creates a document with a nonempty name value
init?(name: String) {
if name.isEmpty { return nil }
self.name = name
}
}
Document륌 ìëžíŽëì±í AutomaticNamedDocument íŽëì€ììë Ʞ볞 ìì±ìì ì§ì ìì±ì륌 ì€ë²ëŒìŽë©íŽì ì€íšê°ë¥í ìì±ì륌 ì€íšë¶ê°ë¥í ìì±ìë¡ ë§ë€ìë€. ìŽêž°ê°ìŽ ìë 겜ì°ìë nameì Ʞ볞ê°ìŒë¡ **[Untitled]**륌 ë£ëë¡ íë€.
class AutomaticallyNamedDocument: Document {
override init() {
super.init()
self.name = "[Untitled]"
}
override init(name: String) {
super.init()
if name.isEmpty {
self.name = "[Untitled]"
} else {
self.name = name
}
}
}
Document륌 ìëžíŽëì±í ë ë€ë¥ž íŽëì€ UntitledDocument ììë Ʞ볞 ìì±ì륌 ì€ë²ëŒìŽë© íŽì ìì±ì륌 구ííê³ , ê·ž ê°ìŽ ìµì ë ê°ì ê°ì§ ìëë¡ ëëí(!)륌 ì¬ì©íì¬ ê°ì ìžëí íŽì£Œìë€. super.init(name: “[Untitled]”)!
class UntitledDocument: Document {
override init() {
super.init(name: "[Untitled]")!
}
}
Failable init! ìì±ì
ì€íšê°ë¥í ìì±ì륌 init? í€ìëë¡ ë§ë€ì§ë§, ìµì ë íì ìŽ ìë ìžì€íŽì€ë¥Œ ë§ëë ì€íšê°ë¥í ìì±ì륌 ë§ë€ê³ ì¶ë€ë©Ž init! ì ì¬ì©íë©Ž ëë€. init!ìì±ì륌 ììí ëë init! ìì±ìë¡ ìžíŽ ì€íší ì ìêž° ë묞ì 죌ìíŽìŒíë€.
íì ìì±ì (Required Initializers)
몚ë ìëžíŽëì€ìì ë°ëì 구ííŽìŒ íë ìì±ìë ìë ìì ì ê°ìŽ required í€ìë륌 ë¶ì¬ì€ë€.
class SomeClass {
required init() {
// initializer implementation goes here
}
}
íì ìì±ìë ììë°ì ìëžíŽëì€ììë ë°ëì required í€ìë륌 ë¶ì¬ì ë€ë¥ž ìëžíŽëì€ìê²ë íì ìì±ììì ëª ííê² ìë €ìŒíë€.
class SomeSubclass: SomeClass {
required init() {
// subclass implementation of the required initializer goes here
}
}
íŽë¡ì ë íšì륌 ì¬ì©íì¬ êž°ë³ž íë¡íŒí° ê° ì€ì íêž°
Ʞ볞 ê° ì€ì ìŽ ëšìí ê°ì í ë¹íë ê²ìŽ ìëëŒ ë€ì ë³µì¡í ê³ì°ì íìíë€ë©Ž íŽë¡ì ë íšì륌 ìŽì©íŽ ê°ì ìŽêž°í íëë° ìŽì©í ì ìë€. Ʞ볞ê°ì ì§ì íêž° ìíŽ íŽë¡ì 륌 ì¬ì©íë ííì ìœëë ë³Žíµ ë€ì곌 ê°ë€.
class SomeClass {
let someProperty: SomeType = {
// create a default value for someProperty inside this closure
// someValue must be of the same type as SomeType
return someValue
}()
}
somePropertyë íŽë¡ì ê° ì€íë ìŽí ë°í íì ìŽ SomeTypeìž SomeValue륌 Ʞ볞ê°ìŒë¡ ê°ê² ëë€.
íŽë¡ì 륌 ìŽêž°ììì ì¬ì©íë©Ž íŽë¡ì ìì selfë ë€ë¥ž íë¡íŒí°ë¥Œ ì¬ì©í ì ìë€. ê·ž ìŽì ë íŽë¡ì ê° ì€íë ìì ì ë€ë¥ž íë¡íŒí°ë ìŽêž°íê° ë€ ëë ê²ìŽ ìëêž° ë묞ìŽë€.
struct Chessboard {
let boardColors: [Bool] = {
var temporaryBoard = [Bool]()
var isBlack = false
for i in 1...8 {
for j in 1...8 {
temporaryBoard.append(isBlack)
isBlack = !isBlack
}
isBlack = !isBlack
}
return temporaryBoard
}()
func squareIsBlackAt(row: Int, column: Int) -> Bool {
return boardColors[(row * 8) + column]
}
}
Chessboardìì boardColors íŽë¡ì 륌 ìŽì©íŽ 8x8 볎ë ìì ê°ë Bool ë°°ìŽë¡ ìŽêž°í ëë€. 볎ëìŽ í¹ì í-ìŽìŽ ìŽë€ ììžì§ íìžíë íšì squarelsBlackAt(row: Int, column: Int)ê° ì ê³µëë€.
let board = Chessboard()
print(board.squareIsBlackAt(row: 0, column: 1))
// Prints "true"
print(board.squareIsBlackAt(row: 7, column: 7))
// Prints "false"
Chessboard() ìíìŒë¡ 8x8 볎ë ìžì€íŽì€ê° ìì±ëìë€. ìì±ë 볎ëìì í¹ì í-ìŽìŽ ìŽë€ ììžì§ ìì볎Ʞ ìíŽ squareIsBlackAt(row: Int, column: Int) íšì륌 ížì¶íë€.