[Swift] Chapter01.Tour - 1
책의 첫 챕터는 tour다.
간단히 전반적인 것들을 소개하는 자리가 될 것으로 보인다.
이제 뭐라고 설명을 하는지 시작해보자.
전통적인 모든 language는 "Hello, world!"를 screen에 띄우는 것으로 시작한다.
print("Hello, world!")C를 할줄아는 사람이라면 친숙해 보이는 문법이나, swift는 저 한줄로 완성된 문법이다. (C는 include부터 시작해서 main 문의 선언이 필요하기 때문이다) 또한 일반적으로 code의 마지막을 알리는 세미콜론(";")도 불필요하다.
Simple Value
let : 상수(constant) 선언
var : 변수(variable) 선언
상수는 컴파일 시점에서 알 필요는 없으나, 한번은 반드시 값을 할당해야 함. 이건 상수가 결정되면 code의 여러곳에서 사용 할 수 있음을 의미.
var myVariable = 42
myVariable = 50
let myConstant = 42상수나 변수는 할당하려는 값의 type과 동일한 것을 할당해야 하지만, 이를 명시적으로 코드에 기입할 필요는 없다. 위의 예시에서 myVariable은 초기값이 정수이기 때문에 해당 변수를 정수라고 추론한다.
초기값이 충분한 정보를 제공하지 않거나 값이 없는 경우는 콜론(:)을 붙여서 유형을 지정한다.
let implicitInteger = 70
let implecitDouble = 70.0
let explicitDouble: Double = 70값은 암시적으로 다른 유형으로 변환되지 않기 때문에 다른 유형으로 변환해야 하는 경우에는 명시적으로 원하는 유형을 적어야 한다.
let label = "The width is "
let width = 94
let widthLabel = label + String(width)문자열에 값을 포함하는 간단한 방법이 있는데 괄호() 안에 변수명을 적고, 괄호 앞에 백슬래시(\)를 넣는 것이다.
let apples = 3
let oranges = 5
let appleSummary = "I have \(appples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."여러줄을 기입해야 하는 경우, """를 사용 할 수 있다. 이때 각 줄 앞에있는 들여쓰기는 닫는 """의 들여쓰기와 일치하면 제거된다.
let quotation = """
I said "I have \(apples) apples."
And then I said "I have \(apples + oranges) pieces of fruit."
"""대괄호([])를 이용하면 배열(arrays)이나 딕셔너리(dictionaries)를 사용 할 수 있다. 각 요소에 대한 접근은 index를 사용하거나 key를 사용하는 방법이 있을 수 있다. 마지막 요소의 뒤에 쉼표(,)를 허용한다.
var fruits = ["strawberries", "Limes", "tangerines"]
fruits[1] = "grapes"
var occupations = [
"Malcolm" : "Captain",
"Kaylee" : "Mechanic",
]
occupations["Jayne"] = "Public Relations"배열은 요소를 추가하면 자동적으로 증가한다.
fruits.append("blueberries")
print(fruits)비어있는 배열이나, 딕셔너리를 만들고자 하면 아래와 같이 초기화 구문을 사용 할 수 있다.
let emptyArray: [String] = []
let emptyDictionary: [String: Float] = [:]유형정보를 유추할 수 있는 경우, 빈 배열이나 빈 딕셔너리의 형태로 작성 할 수 있다.(변수에 새 값을 넣는다거나 혹은 함수의 인자로 전달할 때)
fruits = [] occupations = [:]
Control Flow
조건문을 만들려면 if 혹은 switch를 사용하고, 루프를 만들려면 for-in, while, repeat-while을 사용한다. 조건문이나 루프에서 변수의 주위에 대한 괄호 표시는 선택사항이나, 본문 주의의 괄호는 필수이다.
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)
// Prints "11”if 문을 사용할때 조건은 Boolean 표현식이어야 한다. if score {...}와 같은 형태는 오류이다.
누락도리 수 있는 값으로 작업할 때는 if와 let을 함께 사용 할 수 있고, 이러한 값은 옵션으로 표시된다. 이때, 선택적 값을 포함하거나 nill 값을 입력해여 값이 누락되었음을 나타내야 한다. 값을 선택 사항으로 표시하려면 유형 뒤에 물음표(?)를 작성한다.
선택적 값(Optional value)는 swift에서 추가된 개념이다. swift는 값이 없음을 명확하게 표현하기 위해서 nil 이라는 개념이 사용되는데, 이걸 사용하기 위해서는 변수가 Optional type이어야 한다.
쉽게 말해서 예를 들어 var nickname: String? = nil 이라는 선언이 있다고 한다면 nickname이라는 변수는 optional로 선언되었기 때문에 값이 있을 수도 있고 nil일 수도 있다는 의미이다.
var optionalString: String? = "Hello"
print(optionalString == nil)
// Prints "false"
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}optional value가 nil 이면 조건문은 false가 되어 중괄호의 구문을 수행하지 않는다. 하지만 optional value가 값을 가지고 있다면 let 뒤의 상수에 할당되어 unwrappped 되어서 조건문의 중괄호 내에서 사용이 가능해진다.
다른 방법으로는 default 값을 할당하는 방법이 있는데, 이는 ?? 를 사용하는 방법이다. 만약 optional value가 누락되었다면 default 값이 대신 사용되는 구조이다.
let nickname: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickname ?? fullName)더 짧은 글자를 사용해 값을 unwrapped 할 수 있고, 동일한 이름을 사용할 수도 있다.
if let nickname {
print("Hey, \(nickname)")
}스위치는 모든 종류의 data와 다양한 비교 연산을 지원하며, 정수 및 equality test에만 국한되지 않는다.
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
// Prints "Is it a spicy red pepper?위 예시에서는 let을 사용해서 패턴과 일치하는 값을 상수에 할당하였다.
일치하는 스위치 케이스 내부의 코드를 실행한 후 프로그램은 스위치 문에서 종료된다. C와는 다르게 다음 케이스로 계속해서 진행되지 않음으로 각 케이스의 끝에 명시적으로 break 를 적을 필요가 없다.
for-in을 사용할때 각 key-value 를 받을 수 있는 이름을 지정해서 dictionary 항목을 반복 할 수 있다. dictionary는 순서가 정해지지 않은 type이기 때문에 key와 value가 임의의 순서로 반복된다.
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (_, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
print(largest)
// Prints "25”while을 사용하면 조건이 변경될 때까지 code를 반복해서 동작하게 할 수 있다. 대신 loop의 조건이 마지막에 위치하기 때문에 loop는 한번이상 반드시 실행 될 수 있다. (C에서 do-while을 생각하면 편하다)
var n = 2
while n < 100 {
n *= 2
}
print(n)
// Prints "128"
var m = 2
repeat {
m *= 2
} while m < 100
print(m)
// Prints "128”인덱스의 range를 만들기 위해 ..<를 사용 할 수 있다. 이를 이용해서 index를 loop에 유지 할 수 있다.
var total = 0
for i in 0..<4 {
total += i
}
print(total)
// Prints "6”0..<4 는 4를 포함하지 않는 범위이다. 즉, 0, 1, 2, 3 을 의미한다.
4까지 포함하는 범위를 만들기 위해서는 0...4 라고 기입해야 한다.
댓글
댓글 쓰기