2014년 애플 세계 개발자 컨퍼런스(WWDC) 2014 에서 처음 발표된 애플의 독자적인 템플릿
-문자열 배열에 다른 타입인 숫자 타입의 값을 입력할 수 없음
-타입 안정성을 위해 타입 체크를 해야함
-Swift 컴파일러는 컴파일 시 문제가 발생할 수 있는 nil 객체를 만들거나 사용할 수 없도록 해야 함
-nil을 사용할 경우 '?' 모양의 옵셔널(Optional)을 이용하여 표시
func greet(person: String, from hometown: String) -> String {
return "안녕하세요 \(person)님! \(hometown)에서 오시느라 고생 많으셨습니다 🥹."
}
greet(person: "스코", from: "제주")
-명령형 프로그래밍 패러다임, 객체 지향 프로그래밍 패러다임, 함수형 프로그래밍 패러다임, 프로토콜 지향 프로그래밍 패러다임 지원
카멜 표기법(Camel case)
카멜 표기법(Camel case 카멜 케이스) 또는 낙타 표기법은 프로그래밍에서 파일, 변수, 함수 등 대상의 이름을 띄어쓰기 없이 짓기 위하여 따르는 관례인 네이밍컨벤션(Naming convention)의 하나
예시
-올바른 예시
camelCase(일반적인 변수 이름)
isCamelCase(Boolean 타입의 변수 이름)
-잘못된 예시
camel_case(스네이크 표기법 형태로 지어진 변수명)
A=B
프로그래밍 언어에서 "B 값을 A에 할당한다." 는 의미
-변경할 수 없는 상수를 선언할 때 사용
-변경할 수 있는 변수를 선언할 때 사용
-연산 프로퍼티는 그 때 그 때 계산한 값을 알려주기 때문에 변수를 나타내는 var를 사용하여 선언.
-매번 계산하기 때문에 값을 저장하지 않음
-콘솔에 출력할 때 print() 함수를 사용하여 출력
print("Hello World 🌍") // 출력값: Hello World 🌍
"내용"을 사용하여 표현
var greeting = "Hello World 🌍"
"""내용""" 을 사용하여 표현.
var greeting = """
Hello
World
🌍
"""
-문자 사이에 변수값을 넣고 싶을 때 "\( )"사용
let name = "정종"
var greeting = "Hello \(name)" //출력값: Hello 정종
-한 줄의 주석을 작성할 때 : //
// 한 줄 주석
-여러 줄의 텍스트를 작성할 때 /* */ 사용
/*
여러줄
주석
입니다
*/
func 메서드_이름(아규먼트_레이블: 파라미터_타입 -> 리턴_타입 {//...코드
}
func sayHi(friend: String) {
print("Hi~ \(friend)!")
}
sayHi(friend: "영호")
func sayHi(to friend: String) {
print("Hi~\(friend)!")
}
sayHi(to: "영호")
func sayHi(_ friend: String) {
print("Hi~ \(friend)!")
}
sayHi("영호")
func sayHi(_ friend: String) -> String {
return ("Hi~ \(friend)!")
}
print(sayHi("영호"))
// 출력값: Hi~ 영호!
func sayHi(_ friend: String = "철수") -> String {
return ("Hi~ \(friend)!")
}
print(sayHi("영호"))
// 출력값: Hi~ 영호!
print(sayHi())
// 출력값: Hi~ 철수!
Int
정수를 표현하는 데이터 타입
Float
소수점을 표현하는 데이터 타입, 32비트 부동 소수를 표현할 수 있음
Float의 정밀도는 소수점 이하 6자리까지 가능
var interestRate: Float = 1.2345678910 // Float 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345679 % 입니다
var interestRate: Double = 1.2345678910123456789 // Double 타입
print("이자율은 \(interestRate) % 입니다")
// 출력값: 이자율은 1.2345678910123457 % 입니다
var emptyString: String = ""
var anotherEmptyString = String()
var variableString = "Horse"
variableString += " and carriage"
print(variableString)
// 출력값: "Horse and carriage"
코드를 입력let catCharacters: [Character] = ["S", "a", "y", "H", "i", "!"]
let catString = String(catCharacters)
print(catString)
// Prints "SayHi!"하세요
var anyArray: [Any] = [1,"Hi", true]
var anyValue: Any = 1000
anyValue = "어떤 타입도 수용 가능"
anyValue = 12345.67
// 컴파일 에러
let doubleValue: Double = anyValue // 🚨 에러 메시지: Cannot convert value of type 'Any' to specified type 'Double'
// Any 타입에 Double 값을 넣는 것은 가능하지만
// Any는 Double 과 엄연히 다른 타입이 때문에
// Double 타입의 값에 Any 타입의 값을 할당할 때에는 명시적으로 타입을 변환해 주어야 합니다.
First-In-First-Out (FIFO)
먼저 들어온 값을 먼저 내보내는 구조
Last-In-First-Out(LIFO)
인덱스(index)의 0부터 시작함
처음에 초기화할 때 배열의 길이를 미리 지정하지 않아도 됌
// 생성자로 배열 만들기
var ages = Array<Int>()
print(ages)
// 출력값: []
var numbers = [Int]()
print(numbers)
// 출력값: []
var zeroes = [Int](repeating: 0, count: 10)
print(zeroes)
// 출력값: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
// 배열의 원소 개수
numbers = [5,6]
print("numbers 배열에 있는 value 개수는 \(numbers.count) 개 입니다")
// 출력값: "numbers 배열에 있는 value 개수는 1 개 입니다
// 배열 마지막에 value 추가하기
numbers.append(3)
// 현재 numbers = [5,6,3]
numbers[0] = 9
// 현재 numbers = [9,6,3]
numbers.insert(5, at: 1)
// 현재 numbers = [9,5,6,3]
let secondValue = numbers.remove(at: 1)
// 현재 numbers = [9,6,3]
// secondValue = 5
let lastValue = numbers.removeLast()
// 현재 numbers = [9,6]
// lastValue = 3
let firstValue = numbers.removeFirst()
// 현재 numbers = [6]
// firstValue = 9
// numbers 배열이 비었는지 확인
let isNoNumber = numbers.isEmpty
// isNoNumber = false
numbers.removeAll()
// 현재 numbers = []
// 배열 초기화
numbers = []
// 현재 numbers = []
var letters = Set<String>()
// 값 넣기
letters.insert("Classical Music")
// 초기화
letters = []
var favoriteGenres: Set<String> = ["Rock", "Classical", "Hip hop"]
favoriteGenres = ["Rock", "Classical", "Hip hop"]
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
// 합집합
oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 교집합
oddDigits.intersection(evenDigits).sorted()
// []
// 차집합
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
// 대칭 차집합
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
var namesOfIntegers: [Int: String] = [:]
namesOfIntegers[16] = "sixteen"
// 초기화
namesOfIntegers = [:]
var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
airports["APL"] = "Apple International"
// airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin", "APL": "Apple International"]
// key에 매칭된 value 값 초기화
airports["APL"] = nil
// 딕셔너리 airports에 있는 값의 수
print(airports.count)
// 출력값: 2
// 딕셔너리 airports에 있는 모든 key들
print(airports.keys)
// ["YYZ", "DUB"]
// 해당 key가 있다면 value를 덮어쓰고, 덮어쓰기 전 기존값울 반환
let newYyz = airports.updateValue("Hello YYZ", forKey: "YYZ")
print(newYyz) // 출력값: Optional("Toronto Pearson")
print(airports["YYZ"]) // 출력값: Optional("Hello YYZ")
// 해당 key가 없다면 그 key에 해당하는 value에 값을 추가하고 nil을 반환
let newApl = airports.updateValue("Hello APL", forKey: "APL")
print(newApl) // 출력값: nil
print(airports["APL"]) // 출력값: Optional("Hello APL")
enum CompassPoint {
case north
case south
case east
case west
}
// 한 케이스 선언 방법
var directionToHead = CompassPoint.west
directionToHead = .east
// 활용 예시 1
directionToHead = .south
switch directionToHead {
case .north:
print("북쪽")
case .south:
print("남쪽")
case .east:
print("동쪽")
case .west:
print("서쪽")
}
// 출력값: "남쪽"
// allCases
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) 잔 주문 가능합니다.")
// 출력값: 3잔 주문 가능합니다
좋은 글 잘 읽었습니다, 감사합니다.