์ด๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ง์์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๊ฑฐ๋ ํจ์คํ๊ณ ์๋กญ๊ฒ ์๊ฒ ๋ ์ง์ ์์ฃผ๋ก ์ ๋ฆฌํด ๋ณด๋ ค ํฉ๋๋ค!
์์์ ๋ณ์ (Constants and Variables)
let maximumNumberOfLoginAttempts = 10 // ์์ -> ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
var currentLoginAttempt = 0 // ๋ณ์ -> ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ
var x = 0.0, y = 0.0, z = 0.0
์ฌ๋ฌ ๊ฐ์ ์์ ๋๋ ๋ณ์๋ฅผ ์ ์ธํ ๋, ํ ์ค๋ก ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let height = input[0], width = input[1], k = input[2]
๊ฐ์ธ์ ์ผ๋ก ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ ๋ input๊ฐ์ split๋ก ์ชผ๊ฐ ํ ์ ์ธํ ๋ ํ ์ค ์ ์ธ์ ๋ง์ด ์ฐ๋ ๊ฒ ๊ฐ๋ค.
ํ์ ๋ช ์ (Type Annotations)
var welcomeMessage: String
- ์์ ๋๋ ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ ์ฅํ ์ ์๋ ๊ฐ์ ์ข ๋ฅ๋ฅผ ๋ช ํํ๊ฒ ํ๊ธฐ์ํด ํ์ ๋ช ์ (Type Annotation) ๋ฅผ ์ ๊ณตํ๋ค.
โ ํ์ ์ด๋ ธํ ์ด์ ์ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ ์ข์๊น?
- ๋น์ฐํ๊ฑฐ์ง๋ง ์ ์ธ๊ณผ ์ด๊ธฐํ ํ๋ ๊ตฌ๋ฌธ์ด ๋ถ๋ฆฌ๋ ๊ฒฝ์ฐ ํ์ ์ถ๋ก ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์ ๋ช ์๋ฅผ ํด์ค๋ค.
- ํ์
์ถ๋ก ์ผ๋ก ์ป์ด์ง๋ ํ์
์ด ์๋, ๋ค๋ฅธ ํ์
์ ์ง์ ์ง์ ํ ํ์๊ฐ ์์ ๊ฒฝ์ฐ
- Int ํ์ ๋์ Double์ด๋ Float ํ์
- String ๋์ Character ํ์
- ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด → ์ฑ๋ฅ์์์ ์ด์ ์ด ์๋ค..! ๋น๋ ์๋ ์ฐจ์ด -> ํ์ ๋ช ์๋ฅผ ์งํฅํ์
์์์ ๋ณ์์ ์ด๋ฆ (Naming Constants and Variables)
let n = 3.14159
let ไฝ ๅฅฝ = "ไฝ ๅฅฝไธ็"
let ๐ถ๐ฎ = "dogcow"
- ์ ๋์ฝ๋ (Unicode) ๋ฌธ์๋ฅผ ํฌํจํ์ฌ ๋๋ถ๋ถ์ ๋ฌธ์๋ฅผ ํฌํจํ ์ ์๋ค.
์ธ๋ฏธ์ฝ๋ก (Semicolons)
let cat = "๐ฑ"; print(cat)
- ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅด๊ฒ Swift๋ ์ฝ๋์ ๊ฐ ๊ตฌ๋ฌธ ํ์ ์ธ๋ฏธ์ฝ๋ก (;)์ ํ์์กฐ๊ฑด์ด ์๋๋ค.
- ๊ทธ๋ฌ๋ ์ฌ๋ฌ ๊ตฌ๋ฌธ์ ํ์ค๋ก ์์ฑํ ๊ฒฝ์ฐ ์ธ๋ฏธ์ฝ๋ก ์ ํ์
ํ์ ์ธ์ดํํฐ์ ํ์ ์ถ๋ก (Type Safety and Type Inference)
- Swift๋ *ํ์
-์ธ์ดํ (type-safe)* ์ธ์ด → ๊ทธ๊ฒ ๋ญ๋ฐ?
- ์ฝ๋๊ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ ํ์ ์ ๋ช ํํ๊ฒ ์ ์ ์๋ค.
- ์ปดํ์ผ ํ ๋ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํ๊ณ ์ผ์นํ์ง ์๋ ํ์ ์ ์ค๋ฅ๋ก ํ์ํ๋ค.
let meaningOfLife = 42 // -> Int๋ผ๊ณ ํ์
์ถ๋ก
ํ์ ๋ณ์นญ (Type Aliases)
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min // 0
- ์ด๋ฏธ ์กด์ฌํ๋ ํ์ ์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ์
โ ์ค์ ๋ก ์ด๋ป๊ฒ ์ฐ์ผ๊น?
// Alamofire ๋ด๋ถ ์ฝ๋
public typealias Session = Alamofire.Session
internal typealias Request = Alamofire.Request
internal typealias DownloadRequest = Alamofire.DownloadRequest
internal typealias UploadRequest = Alamofire.UploadRequest
internal typealias DataRequest = Alamofire.DataRequest
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค ๋ ๋ง์ด ์ด๋ค.
ํํ (Tuples)
let http404Error = (404, "Not Found") // ํํ -> (Int, String)ํ์
- ์ฌ๋ฌ๊ฐ์ ๋จ์ผ ๋ณตํฉ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํ
let (statusCode, statusMessage) = http404Error
print("The status code is \\(statusCode)")
// Prints "The status code is 404"
print("The status message is \\(statusMessage)")
// Prints "The status message is Not Found"
- ํ์ ๋ด์ฉ์ ๋ณ๋์ ์์ ๋๋ ๋ณ์๋ก ๋ถํด (decompose) ํ์ฌ ์ ๊ทผํ ์ ์๋ค.
- ์จ๋ณธ ์ ์ด ์๋ ๊ฒ ๊ฐ๋ค..!
์ต์ ๋ (Optionals)
- ๊ฐ์ด ์์ด์ ์ต์ ๋์ ํ์ด์ ๊ฐ์ ์ ๊ทผํ๊ฑฐ๋ or ๊ฐ์ด ์์ ์๋ ์๋ค.
- ์ต์ ๋์ด ์๋ ์์์ ๋ณ์์๋ nil ์ ์ฌ์ฉํ ์ ์๋ค.
๊ฐ์ ์ธ๋ํ Forced Unwrapping) & ์ต์ ๋ ๋ฐ์ธ๋ฉ (Optional Binding)
// ๊ฐ์ ์ธ๋ํ
if convertedNumber != nil {
print("convertedNumber has an integer value of \\(convertedNumber!).")
}
// ์ต์
๋ ๋ฐ์ธ๋ฉ
if let actualNumber = Int(possibleNumber) {
print("The string \\"\\(possibleNumber)\\" has an integer value of \\(actualNumber)")
} else {
print("The string \\"\\(possibleNumber)\\" could not be converted to an integer")
}
- ! ํค์๋๋ก ๊ฐ์ ์ธ๋ํ์ ํ ์ ์์ง๋ง ์ต๋ํ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฐ์!
if let ๊ตฌ๋ฌธ์์ =๋ฅผ ์๋ตํ๊ธฐ
et myNumber: Int? = 123
if let myNumber {
print("My number is \\(myNumber)")
}
// Xcode 14 ์ด์๋ถํฐ๋ง error ์์ด ์ปดํ์ผ ๊ฐ๋ฅ
์์์ ์ผ๋ก ์ธ๋ํ ๋ ์ต์ ๋ (Implicitly Unwrapped Optionals)
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation point
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation point
- ์ต์ ๋์ ๋ง๋ค๊ธฐ์ํด ํ์ ๋ค์ ๋ฌผ์ํ (String?)๋ฅผ ์์ฑํ๋ ๋์ ์ ๋๋ํ (String!) ๋ก ์์์ ์ผ๋ก ์ธ๋ํ ๋ ์ต์ ๋์ ์์ฑํ๋ค.
- ์ ์ฐ๋๊ฑฐ์ผ..?
- ์ต์ ๋์ด ์ฒ์ ์ ์๋ ์งํ์ ์ต์ ๋์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒ์ผ๋ก ํ์ธ๋๊ณ ๊ทธ ์ดํ ๋ชจ๋ ์์ ์ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ
์๋ฌ ์ฒ๋ฆฌ (Error Handling)
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich() // ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์
} catch SandwichError.outOfCleanDishes { // ๊นจ๋ํ ๊ทธ๋ฆ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์
washDishes()
} catch SandwichError.missingIngredients(let ingredients) { // ์ฌ๋ฃ๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์
buyGroceries(ingredients)
}
- ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ ์์ธ์ ํ๋ณํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์ผ๋ก ์ ํ ํ ์ ์๋ค.
์ญ์ค๊ณผ ์ ์ ์กฐ๊ฑด (Assertions and Preconditions)
- ๋ฐํ์์ ๋ฐ์ํ๋ ์กฐ๊ฑด์ด๋ค.
- ๊ฐ ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋์ง ํ์ธํ ์ ์๋ค.
์ญ์ค์ ํตํ ๋๋ฒ๊น (Debugging with Assertions)
let age = -3
// ์กฐ๊ฑด์ด true์ด๋ฉด ๊ณ์ ์งํ, false๋ฉด ํ๋ก๊ทธ๋จ ์ข
๋ฃ
assert(age >= 0, "A person's age can't be less than zero.")
- [assert(_:_:file:line:)] ํจ์๋ก ์ญ์ค์ ์์ฑํ ์ ์๋ค.
if age > 10 {
print("You can ride the roller-coaster or the ferris wheel.")
} else if age >= 0 {
print("You can ride the ferris wheel.")
} else {
assertionFailure("A person's age can't be less than zero.")
}
- ์ญ์ค์ด ์คํจ๋์๋์ง๋ฅผ ์๋ ค๋ฉด? → [assertionFailure(_:file:line:)] ํจ์๋ฅผ ์ฌ์ฉ
๊ฐ์ ์ ์ ์กฐ๊ฑด (Enforcing Preconditions)
// index > 0์ด false๋ฉด
precondition(index > 0, "Index must be greater than zero.")
- [precondition(_:_:file:line:)] ํจ์๋ก ์ ์ ์กฐ๊ฑด์ ์์ฑ
- ์กฐ๊ฑด์ด false ์ผ ๊ฒฝ์ฐ ์ถ๋ ฅ๋ ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌ
'Swift Language Guide' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift Language Guide] ํจ์(Functions) (0) | 2023.05.24 |
---|---|
[Swift Language Guide] ์ ์ดํ๋ฆ(Control Flow) (0) | 2023.05.24 |
[Swift Language Guide] ์ฝ๋ ์ ํ์ (Collection Types) (0) | 2023.05.24 |
[Swift Language Guide] ๋ฌธ์์ด๊ณผ ๋ฌธ์ (Strings and Characters) (2) | 2023.05.16 |
[Swift Language Guide] ๊ธฐ๋ณธ ์ฐ์ฐ์ (Basic Operators) (0) | 2023.05.16 |