Swfit 문법 2

이나래·2022년 9월 26일
  • 정수 데이터 타입 : Int

32비트 부호 있는 정수 데이터 타입에 대한 최솟값과 최댓값을 출력하는 법

print("Int32 Min = (Int32.min) Int32 Max = (Int32.max)")
// int형은 플랫폼에 따라 크기가 다름
// 결과 값 : Int32 Min = -2147483648 Int32 Max = 2147483647

  • 문자 데이터 타입 : Character
    문자, 숫자, 문장 부호, 심볼 같은 유니코드 문자 하나를 저장

var myChar3 : Character = "X" // ‘ : Character ‘ 생략불가, 생략하면 String형임
print(type(of:myChar3)) // 결과 : Character

var myChar4 = "\u{0058}" // 유니코드 형식
print(myChar4) // 결과 : X

  • 문자열 데이터 타입 : String
    단어나 문장을 구성하는 일련의 문자

var userName = "Kim" // ‘ : String ‘ 생략하는 것이 일반적임
var age = 20
var message = "(userName)의 나이는 (age)입니다."
print(message)

// 결과 : Kim의 나이는 20입니다.

  • var와 let의 차이
    var는 초기값이 변경 가능하지만 let은 초기값 변경이 불가능 하기 때문에 에러를 발생시킴

var x = 10
print(x) // 10
x = 20
print(x) //20

let x = 10
print(x)
x = 20
print(x)

결과 :
// main.swift:4:1: error: cannot assign to value: 'x' is a 'let' constant
// x = 20
// ^
// main.swift:1:1: note: change 'let' to 'var' to make it mutable
// let x = 10
// ^~~
// var -> var로 선언하라는 의미 (에러 발생)

  • 타입 어노테이션(type annotation)과 타입 추론(type inference)
    ‘ : Int ‘ 를 직접 쓰는 것을 타입 어노테이션이라고 함
    어노테이션 생략 시 자동으로 지정해주는 것을 타입 추론이라고 함
  • 튜플 (Tuple)
    여러 값을 하나의 개체에 일시적으로 묶는 방법

인덱스 2의 위치를 추출하고 그 값을 새로운 문자열 변수에 할당

let myTuple = (10, 12.1, "Hi") // 첫번째부터 인덱스 위치 0, 1, 2
var myString = myTuple.2 // myTuple의 인덱스 2를 출력
print(myString)

// 결과 : Hi

myTuple의 자료형 출력하는 방법

let myTuple = (10, 12.1, "Hi")
var (myInt, myFloat, myString) = myTuple
print(type(of:myTuple)) // myTuple의 자료형을 출력

// 결과 : (Int, Double, String)

let myTuple = (count: 10, length: 12.1, message: "Hi")
print(myTuple.count) // 결과 : 10
print(type(of:myTuple))

// 결과 : (count: Int, length: Double, message: String)

let myTuple1 = (10, 12.1, "Hi")
print(myTuple1.1) // 결과 : 12.1
print(type(of:myTuple1.1)) // myTuple1 의 인덱스 1의 자료형을 알려줌

// 결과 : double

let myTuple2 = (10, 12.1, "Hi")
var (myInt, _, myString) = myTuple2 // 무시하고 싶은 값에 밑줄을 사용하면 그 값은 무시
print(myInt)

// 결과 : 10

  • 옵셔널(optional) 타입
    값을 반환할 때 오류가 발생할 가능성이 있는 값은 옵셔널 타입이라는 객체로 감싸서 반환함

print(10)
print(Int("12"))
print(Int(“hi"))

결과 :
// 10
// Optional(12)
// nil, 정수 값을 반환할 수 없음 아무런 값도 반환할 수 없다는 의미로 nil을 반환

nil 저장하려면 옵셔널 타입으로 선언해야함

옵셔널 선언 시 자료형 뒤에 ?
옵셔널 언래핑 시 변수명 뒤에 !

  • 옵셔널 타입 강제 언래핑 (forced unwrapping)
    옵셔널 변수에 값으 있으면 옵셔널로 래핑되었다고 함
    옵셔널에 래핑된 값은 강제 언래핑으로 풀어줌

var x : Int? // 옵셔널 정수형 변수 x 선언
var y : Int = 0
x = 10 // 주석처리 시 x가 nil 값이 되므로 언래핑이 되지 않고 crash 남
print(x) // Optional(10)
print(x!) // forced unwrapping해서 10이 나옴
print(y)
x = x! + 2 // Optional은 언래핑을 통해 연산 해야함
print(x)
y = x!
print(y)

결과 :
// Optional(10)
// 10
// 0
// Optional(12)
// 12

var x : Int?
x = 10
if x != nil { // nil이 아닐 시에 언래핑
print(x!)
}
else { print("nil")
}
var x1 : Int?
if x1 != nil {
print(x1!)
}
else { print("nil")
}

결과 :
// 10
// nil

  • 옵셔널 바인딩(Optional binding)
    강제 언래핑 하는 또 다른 방법으로 옵셔널 바인딩을 이용하여 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

var x : Int?
x = 10
if let xx = x { // 옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x, xx)
}
else {
print("nil")
}
var x1 : Int?
if let xx = x1 { // 옵셔널 변수 x1이 값이 없어서 if문의 조건이 거짓이 되어 if문 실행하지 않고 else로 감
print(xx)
}
else {
print("nil")
}

결과 :
// Optional(10) 10
// nil

-> if let xx = x 와 if let x = x 같은 의미임 (위 아래 둘 다 사용 가능)

var x : Int?
x = 10
print(x) // optional(10)
if let x = x { //옵셔널 변수 x가 값(10)이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문 실행
print(x) //10
}
else {
print("nil")
}

  • 여러 옵셔널 언래핑
    여러 옵셔널 변수를 한 번에 언래핑 하는 방법은 ‘ , ‘임

var pet1: String?
var pet2: String?
pet1 = "cat"
pet2 = "dog"
if let firstPet = pet1, let secondPet = pet2 {
print(firstPet, secondPet)
} else {
print("nil")
}

// 결과 : cat dog

  • 범위 연산자 One-Sided Ranges

let names = ["A", "B", "C", "D"]
for name in names[...2] { // 2 이상 나타냄
//[..<2] 2 이하 나타냄
// [...2] 2 까지 나타냄
print(name)
}

결과 :
// C
// D

let names = ["A", "B", "C", "D"]
for name in 1...10 {
print(name)
}

결과 :
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
//10

  • Nil-Coalescing Operator (nill 합병 연산자) ??
    ‘ 옵셔널 변수 ‘ ?? ‘ nil ‘ 일 때 할당되는 값
    옵셔널 변수의 값이 nil이면 ?? 다음 값으로 할당됨
    옵셔널 변수의 값이 nil이 아니면 언래핑 된 값이 나옴

let defaultAge = 1
var age : Int?
age = 3
print(age) // 결과 : optional(3)
var myAge = age ?? defaultAge // age가 nil이 아니므로 언래핑된 값이 나옴
print(myAge) // 결과 : 3

let defaultAge = 1
var age : Int?
//age = 3
print(age) // 결과 : nil
var myAge = age ?? defaultAge //age가 nil이므로 ?? 다음 값인 defaultAge의 값이 출력
print(myAge) // 결과 : 1 -> defaultAge 값이 1이기 때문

let defaultColor = "black"
var userDefinedColor: String? // defaults to nil

var myColor = userDefinedColor ?? defaultColor
// nil이므로 defaultColor인 black으로 할당됨

print(myColor) // 결과 : black

userDefinedColor = "red"
myColor = userDefinedColor ?? defaultColor
// nil이 아니므로 언래핑된 red가 할당됨

print(myColor) // 결과 : red, 주의 optional(red)가 아님

  • _로 참조체(i) 생략 가능

for _ in 1...5 { print("안녕")
}
for i in 1...5 { print("(i) 안녕")
}

결과 :
// 안녕
// 안녕
// 안녕
// 안녕
// 안녕
// 1 안녕
// 2 안녕
// 3 안녕
// 4 안녕
// 5 안녕

  • 배열의 항목 접근

let names = ["A", "B", "C", "D"]
for name in names {
print(name)
}

결과 :
// A
// B
// C
// D

  • 반복문에서 빠져나오기 (break)

for i in 1..<10 {
if i > 5 { break } // if i > 5 break로 할 경우 에러 발생, 반드시 {} 사용
print(i)
}

결과 :
// 1
// 2
// 3
// 4
// 5

  • if문 조건에서 콤마의 의미

var a = 1
var b = 2
var c = 3
var d = 4
if a < b && d > c { // 1 < 2 and 4 > 3 둘 다 참이므로 yes
print("yes")
}
if a < b, d > c { // if문에서 콤마는 AND(&&)의 의미
print("yes")
}

결과 :
// yes
// yes

  • 다중 if-else문 : BMI 계산 결과 판정

let weight = 60.0
let height = 170.0
let bmi = weight / (heightheight0.0001) // kg/m*m
var body = ""

if bmi >= 40 {
body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI:(bmi), 판정:(body)")

// 결과 : BMI:20.761245674740483, 판정:정상

< 인덕대학교 'iOS 프로그래밍 기초' 한성현 교수님 강의 자료 참고 >

0개의 댓글