Swift 기본 타입
- Int
- Double
- Boolean
- String
- Tuple
// Int
1
// Double
1.0
// Boolean
true
false
// String
"Swift Coding Tutorials"
// Tuple
(1, "튜플")
콘솔출력
print("출력하기")
상수와 변수
// 상수
let name = "코딩튜터"
// 변수
var count = 3
상수는 한번 값을 설정하면 변경할 수 없습니다. 변수는 이름처럼 여러번 설정해서 값 변경이 가능합니다.
연산자
1 + 1
1 - 1
1 * 2
1 / 3.0
위와 같이 사칙연산을 할 수 있습니다.
다만 나눗셈할때 결과가 실수로 예상되는 연산에는 3.0 과 같이 Double 타입으로 연산을 해야 정확한 결과값을 얻을 수 있습니다.
비교
let num = 1
num == 1 // 같다
num != 2 // 같지 않다
num > 0 // 0 보다 크다
num < 2 // 2 보다 작다
num >= 0 // 0 보다 크거나 같다
num <= 2 // 2 보다 작거나 같다
Optional
프로그램의 안정성을 위해서 오류를 발생시키시는 대신에 nil 을 발생시키는 것을 옵셔널(Optional) 이라고 합니다. 일반 자료형 타입은 nil 을 반환할 수 없습니다. 옵셔널은 nil 또는 값을 가질 수 있습니다.
* nil 은 다른프로그래밍 언어에서 NULL 로 불립니다.
var value: Int
print( value ) // 에러발생 & 프로그램 중단!!!
print( "다음작업" )
값을 할당하지 않고 변수를 호출하면 에러가 발생하고 프로그램이 중단됩니다. 결과적으로 마지막에 "다음작업"은 출력되지 않습니다. 앞서 이야기한대로 프로그래밍에 안정성에 문제가 생길 수 있는 부분입니다.
var opt: Int?
옵셔널은 타입뒤에 ? 를 붙혀서 만들 수 있습니다.
print( opt ) // nil 출력
opt = 3
print( opt ) // Optinoal(3) 출력
값을 할당되지 않은상태에서 호출하면 nil 이 리턴되고 프로그램이 중단되지 않습니다. 다음으로 값을 할당하고 호출하면 Optional(값)과 같은 형태로 리턴됩니다.
opt = nil
print(opt ?? 1) // 1 출력
opt = 3
print(opt ?? 1) // 3 출력
?? 연산자를 이용하면 옵셔널을 벗겨내고 값을 리턴하게 됩니다. 2번 줄에 opt 값이 nil 이면 오른쪽 1 을 출력하고 4번 줄에 opt 값이 할당되어 있을때 Optional(3) 에서 옵셔널을 벗겨내고 값 3을 리턴합니다.
print( opt! )
! 를 사용해서 강제로 Optional 을 벗겨낼 수 있지만 값이 할당되지 않은 상태에서 사용하면 에러를 발생시킬 수 있으니 주의해야 합니다.
Boolean 연산
let check = true
!check // not
check && true // And 연산
check || true // Or 연산
문자열
// 타입 1
var str1 = "문자열"
// 타입 2
var str2 = """
여러줄의 문자열을
다루기 쉽습니다
"""
""" 쌍따옴표 3개로 \n \r 과 같은 개행문자 없이도 여러줄의 문자열을 생성할 수 있습니다.
let name = "코딩튜터"
let str3 = "이름: \(name)" // 변수 삽입
\( ) 형식 안에 변수를 삽입해서 문자열을 생성할 수 있습니다.
var str = "123456789"
print( str.prefix(3) ) // 앞에서 3개, 123 출력
print( str.suffix(3) ) // 뒤에서 3개, 789 출력
let start = str.index(
str.startIndex,
offsetBy: 3 // 앞에서 3개 건너뛰고
)
let end = str.index(
str.endIndex,
offsetBy: -3 // 뒤에서 3번 까지
)
print( str[start...end] ) // 4567 출력
다른 프로그래밍 언어와 비교해서 문자열 자르기는 간단해 보이지 않습니다.
배열
var names = ["Apple", "Banana"]
간단하게 대괄호 [ , ] 를 사용해서 배열을 생성할 수 있습니다.
name[1] // Banana
배열의 1번 에 위치한 값을 리턴합니다. 배열에서 인덱스는 0부터 시작이기 때문에 1번이 두번째 요소를 가리킵니다.
names.append("kiwi")
names.insert("mango", at: 0)
append 와 insert 를 사용해서 배열의 요소를 추가할 수 있습니다. append 는 배열의 마지막에 요소를 추가하고 insert 는 위치를 지정해서 배열에 추가할 수 있습니다.
names.removeFirst() // 배열의 처음 요소 제거
names.removeFirst(2) // 배열의 처음 요소 2개 제거
names.removeLast() // 배열의 마지막 요소 제거
names.removeLast(2) // 배열의 마지막 요소 2개 제거
names.remove(at: 2) // 배열의 2번 요소 제거
names.removeAll() // 배열의 모든 요소 제거
remove() 함수를 사용해서 배열의 요소를 제거할 수 있습니다.
names.contains("apple") // true 리턴
contains() 함수를 사용해서 배열에 요소가 포함되어 있는지 확인할 수 있습니다.
Set
var names = Set( ["apple", "banana"] )
names.insert("kiwi") // 추가
names.remove("banana") // 제거
names.contains("apple") // "apple" 이 포함되어 있는지 확인
Set 은 중복을 허용하지 않는 배열입니다. 배열과 유사한 방식으로 사용할 수 있습니다.
Dictionary
var dic = [
"apple": 3,
"banana": 2
]
Dictionary 는 키값을 갖는 배열입니다.
// 값 출력
print( dic["apple"] ) // 3
// 값 변경
dic["banana"] = 5
// 삭제
dic["kiwi"] = nil
조건문
조건문 - if
let condition = true
let condition2 = true
if condition {
...
}
if condition {
...
} else if condition2 {
...
} else {
...
}
옵셔널 언래핑
var name: String? = "코딩튜터"
if let name = name {
...
}
if 문 내부에서 name 은 Optional("코딩튜터") 가 아닌 "코딩튜터" 를 리턴하게 됩니다.
조건문 - for
let numbers = [1,2,3,4,5]
for value in numbers {
...
}
for value in 0..<5 { // 0 부터 4 까지, 0, 1, 2, 3, 4
...
}
for value in numbers[...2] { // 뒤에 2개 빼고, 1, 2, 3
...
}
for value in numbers[2...] { // 앞에서 2개 빼고, 3, 4, 5
...
}
위에서 numbers[...2] 처럼 배열을 간단히 자를 수 있습니다. 이전에 문자열 자르기에서 복잡한 코드로 문자열을 배열로 만들었는데 number[...2] 를 조금 응용하면 좀더 간단하게 자르기를 구현할 수 있습니다.
// 문자열 -> 배열
var numbers = Array("12345")
// 배열 자르기, Int 배열 -> String 배열, 배열 -> 문자열
var str = numbers[2...2].map({String($0)}).joined()
// 결과 출력
print( str ) // 3
중간에 map({ }) 함수는 클로저로 반복문을 대신한 함수식입니다.
조건문 - while
var job = true
while job {
...
job = false
}
while 조건문을 반복하다기 작업을 마치고 싶을때 job = false 를 통해서 반복문을 빠져나오게 할 수 있습니다.
조건문 - switch
var value = 2
switch value {
case 1:
print("1")
case 2:
print("2")
default:
break
}
Swift 에서 switch 는 기능이 다양합니다. Int 뿐만아니라 String, 튜플 까지 사용할 수 있고 값의 범위를 지정할 수도 있습니다.
문자열 사용하기
var value = "a"
switch value {
case "a":
print(value)
case "b", "c", "d": // 범위지정 타입 1
print(value)
case "e"..."z": // 범위지정 타입 2
print(value)
default:
break
}
튜플 사용하기
let tuple = (0, 100)
switch tuple {
case (0, 100):
print(tuple)
case (50, 50):
print(tuple)
case (_, 200): // 첫 요소값 상관없이 두번째 요소 값이 200 이면 해당
print(tuple)
case let(x, y) where y > 300: // 범위지정
print(tuple)
default:
break
}
함수
// 함수 선언
func work() {
...
}
// 함수 호출
work()
전달값이 있을때
// 함수 선언
func work(param: String) {
...
}
// 함수 호출
work(param: "p")
리턴형 함수
// 함수 선언
func work() -> Bool {
return true
}
// 함수 호출
let result: Bool = work()
전달값 + 리턴형
// 함수 선언
func work(param: String) -> Bool {
return true
}
// 함수 호출
let result: Bool = work(param: "p")
전달값 네이밍 생략
// 함수 선언
func work(_ param: String) {
...
}
// 함수 호출
work("p")
전달값 네이밍 변경
// 함수 선언
func work(name param: String) {
print( param )
}
// 함수 호출
work(name: "p")
댓글