[Swift] 스위프트의 값, 반복문, 조건문의 특징

이상현·2024년 3월 6일

Swift

목록 보기
1/10
post-thumbnail

Swift는 iOS, Mac OS, Watch OS 등의 프로그램을 개발하기 위해 만들어진 애플의 프로그래밍 언어이다.

Swift는 최신 프로그래밍 패턴을 채택하였다.

특징


  • 변수는 항상 사용 전에 초기화한다.
  • 배열의 인덱스는 경계를 벗어난 에러를 검사한다.
  • 정수는 값 오버플로우를 검사한다.
  • 옵셔널은 nil 값 처리를 명시하도록 보장한다. (=Null)
  • 메모리는 자동으로 관리된다.
  • 에러 처리 할때는 예상치 못한 실패를 제어하여 회복하도록 한다.

특징 둘러보기


단순한 값 사용

출력

  • print("Hello world!")
    Hello world! 를 출력한다. 문자열 말고 다른 형식도 출력 가능하다.

선언

  • let var
    상수는 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"]

Control Flow (제어 흐름)

조건문과 반복문

ifswitch로 조건문,
for-inwhile, 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 표현식 이어야 한다.

옵셔널

iflet을 함께 사용하면, 없어진 값을 사용하게 될 수도 있다. 이러한 값은 옵셔널로 나타낸다.

옵셔널은 값을 담고 있거나 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 문

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문이 끝난다.

while

조건이 거짓이 될 때 까지 코드 블럭을 반복한다.
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

for

..< 로 범위를 간단하게 지정할 수 있다.

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 의 글을 요약한 게시글 입니다

0개의 댓글