2022.02.15 - [iOS/Swift_Docs] - [Swift 첫 시작] Swift Docs 읽기
고전적인 방식은 새로운 언어의 첫 번째 프로그램이 화면에 "Hello, world!" 라는 단어를 인쇄하는 것이다. Swift 에서는 한 줄로 이 작업을 수행할 수 있다.
print("Hello, world!");
Swift는 이렇게 표현할 수 있다!
Prints "Hello, world!"
만약 코드를 C 또는 Objective-C로 작성했다면 이 구문이 익숙해 보일 것이다! 그리고 Swift에서, 이 코드 줄은 완전한 프로그램이다.
(대충 Swift로는 이렇게 작성한다는 말을 하고 싶은 것 같다)
입력/출력 또는 문자열 처리와 같은 기능을 위해 별도의 라이브러리를 가져올 필요가 없다. global 범위에서 작성된 코드는 프로그램의 시작점으로 사용되기 때문에 main() 함수가 필요하지 않다. 또 모든 문장의 끝에 세미콜론을 쓸 필요도 없다.
이 투어는 다양한 프로그래밍 작업을 수행하는 방법을 보여줌으로써 Swift에서 코드 작성을 시작할 수 있는 충분한 정보를 제공한다. 이해 못하더라도 걱정말기~ 이 투어에서 소개하는 모든 내용은 이 책의 나머지 부분에 자세히 설명되어 있다.
최상의 환경을 위해서 이 챕터에서 Xcode의 playground를 실행해보자. playground를 통해 코드 목록을 편집하고 결과를 즉시 확인할 수 있다!
간단한 변수
상수를 만들기 위해서는 let을 사용하고 변수를 만들기 위해서는 var을 사용한다. 상수 값은 컴파일 할 때 알 필요가 없지만 값을 정확히 한 번 할당해야 한다. 즉, 상수를 사용하여 한 번 결정하지만 여러 위치에서 사용하는 값의 이름을 지정할 수 있다.
var myVaribale = 42
myVariable = 50
let myConstant = 42
상수 또는 변수는 할당할 값과 유형이 같아야 한다. 하지만 항상 명시적으로 type을 작성할 필요는 없다. 상수 또는 변수를 생성할 때 값을 제공하면 컴파일러가 해당 유형을 유추할 수 있다. 위의 예에서 컴파일러는 초기 값이 정수이므로 myVariable이 정수라고 추측한다.
만약 초기값이 충분한 정보를 제공하지 않거나 초기값이 아닌 경우 변수 뒤에 콜론으로 구분해 유형을 지정한다.
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
연습 | 명시적인 타입이 Float이고 값은 4인 상수를 만들어보자
값은 암시적으로 다른 타입으로 변환되지 않는다. 값을 다른 유형으로 변환해야 하는 경우 원하는 유형의 인스턴스를 명시적으로 만든다.
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
연습 | 마지막 줄에서 String으로 변환을 하지 않는다면 어떤 오류가 발생할까?
문자열에 값을 포함할 수 있는 더 간단한 방법이 있다. 괄호 안에 값을 입력하고 괄호 앞에 \를 사용하는 것! 예를 들자면:
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
연습 | \()을 포함해 floating-point 계산으로 인사말에 다른 사람의 이름을 포함해 사용해보자
여러 줄을 차지하는 문자열에는 세개의 큰따옴표(""")를 사용한다. 따옴표가 있는 각 줄의 시작 부분에 있는 들여쓰기는 닫는 따옴표의 들여쓰기와 일치하면 제거된다. 예를 들면 :
let quotation = """
I said "I have \(apples) apples."
And then I said "I have \(apples + oranges) pieces of fruit."
"""
대괄호([])를 사용해 배열 및 사전을 만들고 대괄호 안에 index, 또는 key를 작성해 해당 요소에 접근한다. 마지막 요소 뒤에는 쉼표가 허용된다.
var shoppingList = ["catfish", "water", "tulips"]
shoppingList[1] = "bottle of water"
var occupation = [
"Malcolm" : "Captain",
"Kaylee" : "Mechanic",
]
occupations["Jayne"] = "Public Relations"
배열은 요소를 추가할 때 자동적으로 커지게 된다.
shoopingList.append("blue paint")
print(shoppingList)
빈 배열 또는 사전을 작성하려면 이니셜라이저 구문을 사용한다.
let emptyArray: [String] = []
let emptyDictionary: [String: Float] = [:]
만약 타입을 유추할 수 있는 경우에는 빈 배열을 [ ]로, 빈 사전을 [ : ]로 작성할 수 있다. 예를 들어 변수에 새 값을 설정하거나 인수를 함수에 전달하는 경우가 해당된다.
shoppingList = []
occupations = [:]
흐름 제어
만약 if와 switch를 사용해 조건을 만들고, for-in, while, repeat-while을 사용해 반복을 만든다. 조건 또는 반복 변수 주변의 괄호는 선택 사항이다. body 주변의 교정기(braces)가 필요하다.
(내용 주변에 괄호가 필요하다는 말을 이렇게 한 듯..?)
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individual Score
{
if score > 50
{
teamScore += 3
} else
{
teamScore += 1
}
}
print(teamScore)
-> 11이 출력된다.
if 문에서 조건은 반드시 boolean 식이어야 한다. -> if score { ... } 와 같은 코드는 오류로서, 암시적으로 0과 비교되는 것이 아니다!
if와 let을 함께 사용해 누락된 값으로 작업할 수 있다. 이런 값은 옵션으로 표시된다. 선택적 값은 값을 포함하거나 값이 누락되었음을 나타내는 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)"
}
연습 | optionalName을 nil로 변경하자. 어떤 인사를 받게될까~? optionalName이 nil일 경우에 else를 추가하고 다른 인사를 또 받아보자
만약 옵션 값이 nil이라면, 상태는 false가 되고 중괄호로 표시된 코드(내용 부분)는 건너뛰게 된다. 그렇지 않으면, 선택적 값은 래핑되지 않고 let을 통해 상수로 할당되어 코드 블록 내에서 래핑되지 않은 값을 사용할 수 있다.
(아니 이거 내가 이해한게 맞는걸까? 나중에 공부하고 다시 와서 수정해야지... 원문은 Otherwise, the optional value is unwrapped and assigned to the constant after let, which makes the unwrapped value available inside the block of code. 였음 ㅜ)
선택적 값을 처리하는 또 다른 방법은 " ?? " 오퍼레이터를 사용해 기본값을 제공하는 것이다. 선택적 값이 누락된 경우 기본 값이 대신 사용된다.
let nickname: String? = nil
let fullName: String = "John Applessed"
let informalGreeting = "Hi \(nickname ?? fullName)"
switch는 정수 및 동일성 테스트에만 국한되지 않고 모든 종류의 데이터와 다양한 비교 작업을 지원한다.
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.")
}
연습 | default 케이스를 없애면 어떤 일이 일어날까?
패턴과 일치하는 값을 상수에 할당하기 위해 패턴에서 let을 사용하는 방법을 알아보자.
(아무래도 let x where x.hasSuffix("pepper") 이 부분을 말하는 듯 하다.
일치하는 switch 케이스 안에서 코드를 실행한 후에 프로그램은 해당 switch 문에서 종료된다. 실행이 다음 케이스까지 이어지지 않기 때문에 각 케이스 코드의 끝에서 명시적으로 switch를 해제할 필요가 없다.
(break 문이 없어도 되는 걸 말하는 듯하다)
각 키-값 쌍에 사용할 이름 쌍을 제공하고, 사전의 항목을 반복하려면 for-in 을 사용한다. 사전은 순서가 지정되지 않기 때문에 키와 값이 임의의 순서로 반복된다.
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)
연습 | _를 변수 이름으로 바꾸고 어떤 종류의 숫자가 가장 컸는지 추적해보자
조건이 변경될 때 까지 코드를 반복하려면 while을 사용한다. 반복의 조건은 적어도 한 번 이상 반복이 실행되게끔 하면서도 끝에 있을 수 있다.
var n = 2
while n < 100 {
n *= 2
}
print(n)
var m = 2
repeat {
m *= 2
} while m < 100
print(m)
" ..< "를 사용해 다양한 index를 만들어 index를 반복해 사용할 수 있다
var total = 0
for i in 0..<4 {
total += i
}
print(total)
최대값을 생략하는 범위를 만들려면 " ..< "을 사용하고 두 값을 모두 포함하는 범위를 만들려면 " ... " 을 사용한다.
'[Non-Updated] iOS > Swift_Docs' 카테고리의 다른 글
[Swift_Docs] WECOME TO SWIFT _ Version Compatibility (0) | 2022.02.16 |
---|---|
[Swift_Docs] WECOME TO SWIFT _ About Swift (0) | 2022.02.16 |
[Swift 첫 시작] Swift Docs 읽기 (0) | 2022.02.15 |