Swift는 정적인 프로그래밍 언어입니다. 정적 프로그래밍 언어란, 컴파일 등 프로그래밍 언어가 실행되기 이전 단계에서 변수/상수의 타입을 결정하는 언어를 의미하며 동적 언어와 비교해 실행이 되기 전에 프로그램의 타당성이 검증되기 때문에 안정성이 높으며 대형 프로그램 개발에 적합하다는 특징을 가지고있습니다
Swift는 nil의 혀용을 제어가 가능합니다. nil이란 값이 존재하지 않는 것을 의미하는 것으로 변수나 상수가 초기화 되지 않은 상태나 참조가 존재하지 않는 상태를 의미합니다. Swift는 기본적으로 변수와 상수에 nil을 대입할 수 없으나 대신 Optional 타입을 가지며 이 타입을 통해 nil에 대한 허용을 제어할 수 있습니다
let a: Optional<Int>
let b: Int
a = nil
b = nil // 'nil' cannot be assigned to type 'Int
var
키워드를 이용하여 선언var sayHi = "Hello, Chen"
sayHi = "Hello, SOPT"
Bool 타입
참 거짓을 나타내는 true와 false가 Bool 리터럴입니다. true와 false를 대입할 때 Type annotation을 해주지 않으면 Bool 타입으로 입력이 됩니다.
let a = true
let b = false
let c = !a // c의 값은 false가 됩니다
Numeric 타입
대표적인 타입으로는 Int가 있으며 그 외에도 다양한 수치 자료형이 존재한다. 수치를 나타내는 리터럴을 숫자 리터럴이라고 하며, 정수 리터럴과 부동소수점 리터럴로 나눌 수 있습니다. 정수 리터럴의 경우 Int외에도 Int8, Int16, Int32, Int64에 대입이 가능하며, 부동소수점의 리터럴의 경우는 Type annotation이 되지 않았다면 Double 타입으로 인식됩니다
let a: Int = 100 // 100
let b: Int64 = Int64(a) // 100
let x: Double = 1.4 // 1.4
let y: Float = Float(x) // 1.4
String 타입
Swift는 값을 큰따옴표(”)로 둘러 싸면 문자열 리터럴로 인식합니다. (값)을 이용하면 원하는 값을 문자열 리터널 내에 포함시킬 수 있습니다
let add = 3 + 7
let str: String = "결과는 \(add)입니다"
“a”와 같은 단일문자는 타입추론을 통해 String으로 인식되기 때문에 Character 타입을 원한다면 Type annotation을 해주어야 합니다
let str1 = "a" // String.Type
let char1: Character = "a" // Character.type
숫자 리터럴을 문자열 리터럴로 변환하기 위해서는 이니셜라이져를 사용하면 됩니다 만약 타입 변환에서 변화하는 타입으로 나타낼 수 없는 경우는 nil을 반환합니다
let a1 = 100
let a2 = String(a1) // "100"
let b1 = "hello"
let b2 = Int(b1) // nil
Swift에서 변수는 선언과 초기화를 동시에 할 수 있지만, 선언만 먼저 해 놓은 다음 필요한 시점에 초기화를 하는 것으로도 분리하여 작성할 수 있습니다.
var first = 1 // 선언과 초기화를 동시에
var second: Int // 선언과 초기화 분리
second = 2 // 초기화
타입 어노테이션이란, 변수나 상수를 선언할 때 그 타입을 명시적으로 선언해 줌으로써 어떤 타입의 값이 저장될 것인지 컴파일러에게 직접알려주는 문법입니다.
// 타입 어노테이션의 예시
var name: String
var Char: Character
var dis: Double
var pi: Float
var flag: Bool
타입 추론이란 타입을 직접 명시하지 않아도 컴파일러가 초기화 된 값을 보고 타입을 추론하는 것을 말합니다
let name = "Cheon" // "Cheon"은 String 값 이겠구나 하고 타입을 추론하고 지정함
print(type(of: name)) // String
이 기능은 직접 타입을 명시하지 않아도 되고, swift 언어 특성 중 하나인 “설계에 의한 안전성” 항목에 타입 추론이 해당 됩니다.
타입 추론의 단점
swift는 타입 안정성 언어이기 때문에 코드를 컴파일 할 때 확인 작업을 수행하고 잘못된 타입이 있다면 오류로서 표시합니다. 특히 이는 타입 추론을 통해 명확하게 타입을 지정해주지 않아도 타입을 지정해주기 때문에 이런 오류를 미연에 방지할 수 있습니다!
let pi = 3.141592
let grade = "A"
Swift에서 변수를 선언할 때 타입을 직접 명시하지 않으면 초기화가 된 값을 보고 타입을 추론하여 지정합니다. 하여 위 코드는 부동소수점의 리터럴인 pi는 Double 타입으로 추론되며 grade는 String 타입으로 추론됩니다.
만약 pi, grade의 타입을 float, Character으로 출력하고 싶다면 Type annotation을 통해 명시적으로 타입을 선언해주는 방법으로 표현할 수 있습니다
let pi: Float = 3.141592
let grade: Character = "A"
+
, -
, *
, /
연산 가능%
) 연산도 가능let first = 10
let second = 3
let sum = first + second
let diff = first - second
let multiple = first * second
let divided = first / second
let remainder = first % second
+
의 경우, String
, array 등 각 타입에 따라 연산됨let str1 = "SOPT"
let str2 = "iOS"
let str = str1 + str2 // "SOPTiOS"
let names1 = ["Cheon", "SeongWoo"]
let names2 = ["Heo", "Jiyoung"]
let names = names1 + names2 // ["Cheon", "SeongWoo", "Heo", "Jiyoung"]
var price1 = 10
price1 += 1 // 11
var price2 = 20
price2 -= 5 // 15
var price3 = 30
price3 *= 3 // 90
var price4 = 40
price4 /= 2 // 20
var quote = "Hello, Swift "
quote += "Playgrounds" // "Hello, Swift Playgrounds"
==
!=
>
>=
… ) 를 이용해서 두 값을 비교 할수 있음let score1 = 6
let score2 = 4
score1 == score2 // false
score1 != score2 // true
score1 > score2 // true
score1 >= score2 // true
score1 < score2 // false
if
를 이용해서 조건에 따라 다른 프로그램이 실행 될수록 할수 있음let num1 = 3
let num2 = 5
let sum = num1 + num2
if sum > 10 {
print("over 10")
} else {
print("not over 10")
}
if
에 들어가는 조건들을 합칠수 있음 ( &&
, ||
를 이용함)let age1 = 15
let age2 = 25
if age1 > 19 && age2 > 19 {
print("19세 이상 영화를 같이 볼수 있겠네요")
}
if age1 > 20 || age2 > 20 {
print("20세 이상 보호자가 있으면 놀이공원에 들어갈수 있어요")
}
let age3 = 30
let age4 = 40
let text = age3 == age4 ? "same" : "not same"
var myMind: String?
var ifULoveMe: Bool?
//여기서부터
if ifULoveMe {
myMind = "나도 너 좋아했어!!! 나랑 사귀자!!!"
} else {
myMind = "나도 너 안 좋아했어! 흥칫뿡야야!!!"
}
//여기까지를 삼항연산자로 표현해주보세여~
→ 아래와 같이 한 줄로 표현할 수 있다!
myMind = ifULoveMe ? "나도 너 좋아했어!!! 나랑 사귀자!!!" : "나도 너 안 좋아했어! 흥칫뿡야야!!!"
for
반복문을 사용해서 array, range 를 돌면서 코드를 반복 수행할수 있음// Range
let numRange = 1...10
for num in numRange {
print("\(num)")
} // 1부터 10까지 반복하며 print 됨
// Array
let names = ["Cheon", "Heo", "Park"]
for name in names {
print("name is \(name)")
} // name is Cheon부터 순서대로 print 됨
for i in stride(from: 0, to: 9, by: 2) {
print(i)
}
// 0, 2, 4, 6, 8을 출력하는 반복문
for i in 0...8 where i % 2 == 0 {
print(i)
}
while
를 사용하면 특정 조건을 만족할때까지 코드를 반복 수행할수 있음var num1 = 1
while num1 <= 20 {
print(num1)
num1 += 1
} // num1이 20보다 작거나 같을 때 까지 1이 증가하며 출력 됨
print("조건을 더 이상 만족하지 않아서, 탈출")
// 추가 코드 0, 2, 4, 6, 8을 출력하는 반복문
var i = 0
while i <= 8 {
print(i)
i += 2
}
repeat
반복문을 이용하면 특정 조건을 만족할때까지 코드를 반복 수행할수 있음while
반복문과 다른점var num2 = 1
repeat {
print(num2)
num2 += 1
} while num2 <= 20
print("조건을 더 이상 만족하지 않아서, 탈출")
// 추가 코드 0, 2, 4, 6, 8을 출력하는 반복문
var i = 0
repeat {
print(i)
i += 2
} while i <= 8
break
키워드를 이용해서 나갈수 있음print("---> Exiting")
for i in 0...10 {
if i == 4 {
break
}
print(i)
}
var countDown1 = 10
while countDown1 > 0 {
countDown1 -= 1
if countDown1 == 3 {
break
}
print(countDown1)
}