Swift는 iOS, Mac OS, Watch OS 등의 프로그램을 개발하기 위해 만들어진 애플의 프로그래밍 언어이다.
Swift는 최신 프로그래밍 패턴을 채택하였다.
nil 값 처리를 명시하도록 보장한다. (=Null)print("Hello world!")let var상수나 변수에 값을 할당하면 컴파일러가 타입을 추론한다.
하지만 초기값의 정보가 충분하지 않거나 없으면 변수 뒤에 콜론으로 구분하여 타입을 지정할 수 있다.
let i = 70
let d1 = 70.0
let d2: Double = 70
값은 절대 암시적으로 다른 타입으로 자동 변환되지 않는다.
값을 다른 타입으로 변환할 필요가 있다면, 원하는 타입의 인스턴스를 명시적으로 만들어야 한다.
let label = "The height is "
let height = 13
let heghtLabel = label + String(width)
또는 다음과 같은 방식으로 문자열에 값을 포함 시킬 수 있다.
let apples = 3
let appleSummary = "I have \(apples) apples."
세개의 큰 따옴표를 사용하여 여러 줄을 차지하는 문자열을 생성할 수 있다.
let quotation = """
동해물과 백두산이 마르고 \(apples) 닳도록
말씀하시길, "하느님이 보우하사" 우리나라 만세
"""
배열과 딕셔너리는 []대괄호로 새성하고, 대괄호 안에 인덱스나 키를 작성하여 원소에 접근한다.
var shoppingList = ["fish", "water", "paint"]
shoppingList[1] = "bottle of water"
print(shoppingList)
// ["fish", "bottle of water", "paint"]
var occupations = [
"Malcolm": "Captain",
"kaylee": "Mechanic",
]
occupations["Jayne"] = "public Relations"
print(occupations)
// ["Jayne": "public Relations", "Malcolm": "Captain", "kaylee": "Mechanic"]
배열에 원소를 추가하면, 배열의 크기가 자동으로 커진다.
shoppingList.append("blue paint")
print(shoppingList)
// ["fish", "bottle of water", "paint", "blue paint"]
딕셔너리의 원소를 추가하거나 수정할 수 있다.
occupations["Ace"] = "Engineer"
occupations["Malcolm"] = "Master"
print(occupations)
// ["kaylee": "Mechanic", "Jayne": "public Relations", "Malcolm": "Master", "Ace": "Engineer"]
if 와 switch로 조건문,
for-in 과 while, repeat-while로 반복문을 만든다.
조건이나 반복 변수에 괄호는 옵션이고, 본문의 중괄호는 필수이다.
let scores = [75, 42, 32, 33, 11]
var teamScore = 0
for score in scores {
if score >= 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore) // 7
if 문의 조건은 반드시 boolean 표현식 이어야 한다.
if와 let을 함께 사용하면, 없어진 값을 사용하게 될 수도 있다. 이러한 값은 옵셔널로 나타낸다.
옵셔널은 값을 담고 있거나 nil을 담아 값이 없다고 표현한다. 옵셔널을 표시하려면 값 뒤에 ?를 붙힌다.
var optionalString: String? = "Hello"
print(optionalString == nil) // false
var optionalName: String? = "John Apple"
// optionalName = nil
var greeting = "Hello!"
if let name = optionalName {
greeting += " \(name)"
} else {
greeting += " Who are you?"
}
print(greeting) // Hello! John Apple
옵셔널 값이 nil 이면 조건은 false 이고, else로 가게 된다.
nil이 아니면, 옵셔널 값의 포장을 풀어서 let 뒤의 상수에 할당해서 포장을 푼 값을 사용 가능하게 한다.
또 다른 방법으로는 ?? 연산자로 디폴트 값을 제공하는 것이다.
옵셔널의 값이 없다면, nil 대신 디폴트 값을 사용한다.
let nickName: String? = nil
let fullName: String = "John Applesseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
print(informalGreeting) // Hi John Applesseed
포장을 푼 값과 같은 이름을 사용하여 더 간결하게 코드를 작성할 수 있다.
if let nickName {
print("Hey, \(nickName)")
}
switch문은 어떤 종류의 자료형도 가능한 비교 연산을 지원한다.
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins.")
case "cucumber", "watercress":
print("That would make a good sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is is a spicy \(x)?")
default:
print("Everything tastes good.")
}
// Is is a spicy red pepper?
break 문을 쓰지 않아도 한 가지의 case만 실행되면 switch문이 끝난다.
조건이 거짓이 될 때 까지 코드 블럭을 반복한다.
repeat 블럭을 먼저 적고, 조건을 끝에 두면 적어도 한번의 실행을 보장할 수 있다. (다른 언어의 do - while)
var n = 2
while n < 100 {
n = n * 2
}
print(n) // 128
var m = 2
repeat {
m = m * 2
} while m < 100
print(m) // 128
..< 로 범위를 간단하게 지정할 수 있다.
var total = 0
for i in 0..<4 {
total += i
}
print(total)
..< 는 가장 윗 값을 생략하고
... 는 양 끝값을 둘다 포함한다.
func 로 함수를 선언한다.
-> 로 변수 이름 및 타입을 함수의 반환 타입과 구분한다.
func greet(person: String, day: String) -> String {
return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")
기본적으로 함수는 매개 변수 이름을 인자의 이름표로 사용해야 한다. (person: "Bob" 처럼)
인자 이름표를 매개 변수 이름 앞에 작성해서 매개 변수 이름과 다르게 설정할 수 있고, _ 를 작성하여 사용하지 않을 수도 있다.
func sayHello(who person: String, _ day: Int) -> String {
return "Hello \(person), this is day \(day)."
}
print(sayHello(who: "Ace", 32))
// Hello Ace, this is day 32.
튜플을 사용해서 여러 값을 반환할 수 있다. 원소의 참조는 이름이나 인덱스로 가능하다.
func calc(scores: [Int]) -> (sum: Int, max: Int, min: Int) {
var max = Int.min;
var min = Int.max;
var sum = 0;
for score in scores {
if score > max {
max = score
}
if score < min {
min = score
}
sum += score
}
return (sum, max, min)
}
let ans = calc(scores: [12, 30, 200, 50, 2, 4])
print("합: \(ans.sum), 최대: \(ans.max), 최소: \(ans.2)")
// 합: 298, 최대: 200, 최소: 2
중첩 함수도 된다.
함수는 일급 타입니다. 즉, 객체로 취급되어 반환값이나 매개변수로 전달하거나 변수에 할당할 수 있다.
다음은 반환값이 함수인 함수이다. 또한 getFunc 상수에 함수를 할당했다.
func makeFunc() -> ((Int) -> Int) {
func addOne(num: Int) -> Int {
return num + 1
}
return addOne
}
let getFunc = makeFunc()
print(getFunc(3)) // 4
print(type(of: getFunc )) // (Int) -> Int
함수는 인수로 함수를 받을 수 있다.
func isAllMathces(_ list: [Int], algor: (Int) -> Bool) -> Bool {
for num in list {
if !algor(num) {
return false
}
}
return true
}
func isEven(number: Int) -> Bool {
return number % 2 == 0
}
let list1 = [2, 4, 6, 8]
let list2 = [10, 11, 12, 14]
print(isAllMathces(list1, algor: isEven))
print(isAllMathces(list2, algor: isEven))
본 게시글은 xho95 (소중한꿈)'s Swift Life 의 글을 요약한 게시글 입니다