iOS/Swift이론

iOS Swift 옵셔널 타입과 강제 언래핑, 연산자, 제어문

Sweetft 2021. 9. 21. 23:04

 

Option Type (maybe type) : 자료형은 값을 저장하기 위한 것인데 의미가 있는 값이 있을 수도 있고 없을 수도 있는 타입이다. 주로 함수형 언어에서 많이 있다. 

Nullable Type : 정적 타입과 동적 타입의 널 타입이 있음. 

정적 타입은 컴파일할 때 결정이 된다는 것, 동적 타입은 실행할 때 결정이 된다는 것이다.

 

Int형과 Optional Int형

10 = Int형 값을 저장 => var x : Int = 10

Optional(10) = Int? ,  Int! => Int형 값을 저장 혹은 값이 없다(nil) => var y : Int? = 10 / var z : Int! (초기값이 없을 때는 자동으로 nil값 저장)

 

옵셔널(optional) 타입

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

Swift로 개발할 때 무조건 쓰이는 문법이니 잘 알아두어야 한다.

 

강제 언래핑 1

var x : Int? = 5
var y : Int = 0
var z : Int!
print(x) // Optional(5)
print(x!) // 5
print(y) // 0
print(z) // nil

변수 x를 Int?와 같이 자료형 뒤에 ?를 붙이며 옵셔널로 래핑했는데 이를 변수명 뒤에 !를 붙이며 강제 언래핑을 시킬 수 있다.

 

var x : Int?
x = 100
if x != nil {
    print("\(x)를 언래핑하여 \(x!)가 되었습니다")
    //Optional(100)를 언랩핑하여 100가 되었습니다
}
else {
    print("nil")
}
var x1 : Int?
if x1 != nil {
    print("\(x1)를 언래핑하여 \(x1!)가 되었습니다")
}
else {
    print("nil")
    //nil
}

여기서 if x != nil 부분에서 if x!=nil이라고 적게되면 != 보다 x!의 연산자 우선순위가 더 높기 때문에 주의해야 한다.

 

강제 언래핑 2

 

optional binding : 옵셔널에 할당된 값을 임시 변수 또는 상수에 할당

if let , if var을 사용한다.

var x : Int?
x = 10
if let xx = x {
    //옵셔널 변수 x가 값이 있으므로 언래핑해서 일반 상수 xx에 대입하고 if문을 실행한다.
    print(x,",",xx) // Option(10) , 10
}
else {
    print("nil")
}
var y : Int?
if let y = y {
    //옵셔널 바인딩을 할 때 옵셔널 변수와 일반 상수의 이름이 같아도 된다.
    print(y)
}
else {
    print("nil") // nil
    //옵셔널 변수 y가 값이 없으므로 nil을 출력한다.
}

 

여러 옵셔널 변수 언래핑 하기

var pet1 : String? = "Nala"
var pet2 : String? = "Daisy"
if let firstPet = pet1, let secondPet = pet2 {
    print(firstPet,"and", secondPet) //Nala and Daisy
} //콤마를 이용해 여러 옵셔널 변수를 한 번에 언래핑할 수 있다. 각 변수의 앞에 모두 let을 붙여야한다는 것에 주의하자.
else {
    print("nil")
}
var x : Int? = 1
var y : Int? = 2
var z : Int? = 3
print(x) //Optional(1)
print(y) //Optional(2)
print(z) //Optional(3)
if let x1 = x, let y1 = y, let z1 = z {
    print(x1, y1, z1) //1,2,3
}
else {
    print("nil")
}

 

Int? 와 Int!

let x : Int? = 1
let y : Int = x!
let z = x
print(x,",",y,",",z) //Optional(1) , 1 , Optional(1)
print(type(of:x),",", type(of:y),",", type(of:z)) //Optional<Int> , Int , Optional<Int>

let a : Int! = 2
print("a=", a, type(of:a)) //a= Optional(2) Optional<Int>
let b : Int = a
print("b=", b, type(of:b)) //b= 2 Int
let c : Int = a!
print("c=", c, type(of:c)) //c= 2 Int
let d = a
print("d=", d, type(of:d)) //d= Optional(2) Optional<Int>
let e = a + 3
print("e=", e, type(of:e)) //e= 5 Int

Int!는 Optional로 사용되지 않을 때 자동으로 unwrap하기 때문에 더 편리하다.

 

 

nil ? 값이 없는 상태!

 

 

클래스(설계도)로부터 만들어진 객체를 인스턴스(실제로 메모리에 올라와 있는 객체)라고 한다.

When an object is created by a constructor of the class, the resulting object is called an instance of the class. (wikipedia) - 클래스로부터 객체가 만들어질 때, 그 결과물을 클래스의 인스턴스라 한다.

 

 

형변환에는 as와 as!, as?가 존재한다.

as는 upcasting에 쓰이는데, 이는 자식 인스턴스를 부모로 캐스팅하는 데 사용한다. 자식 인스턴스 as 부모클래스

as!, as?는 downcasting에 쓰이는데. 이는 부모 인스턴스를 자식 클래스로 변환하는 데 사용한다.

     -부모 인스턴스 as! 자식 클래스 // 일반 타입으로 반환. 성공 확신 있을 때 사용

     -부모 인스턴스 as? 자식 클래스 // 옵셔널 타입으로 반환. 성공 확신 없을 때 사용

 

타입 검사 is 키워드 : 지정된 인스턴스가 해당 클래스인가 검사

     if thisobject is ThisClass {

       //thisobject는 ThisClass의 인스턴스이다.

     }

 

 

Swift의 연산자

[범위 연산자]

x...y   -x에서 시작해서 y로 끝나는 범위에 포함된 숫자

x..<y   -x에서 시작해서 y가 포함되지 않는 범위에 포함된 숫자

 

let nums = ["0","1","2","3","4"]
for num in nums[1...] {
    print(num,terminator:" ") // 1 2 3 4
    //terminator:" "줄바꿈 방지
}
print("\n")
for num in nums[...2] {
    print(num,terminator:" ") // 0 1 2
}
print("\n")
for num in nums[..<2] {
    print(num,terminator:" ") // 0 1
}

 

 

Swift의 연산자

 

for-in 반복문 : 컬렉션 또는 숫자 범위 내에 있는 목록 반복

for 상수명 in 컬렉션 or 범위{

}

for _ in 1...3 {
    print("Hello", terminator:" ") //Hello Hello Hello
}
for var i in 1...3 {
    print(i, terminator:" ") // 1 2 3
    i = i + 1
}

Swift에서는 값이 없을 때는 빈자리에 _를 넣을 수 있다.

 

while 반복문(조건이 안 맞으면 아예 실행x)

 

 

repeat-while 반복문(조건이 안 맞아도 최초 1회는 무조건 실행)

 

 break(중간에 반복문 빠져나오는 명령어)

for i in 1...10 {
    if i > 3 {
    break
    }
    print(i) /123
}

 

continue문 : 반복문에서 continue문 이후 모든 코드를 건너뛰고 반복문의 상단 시작 위치로 돌아간다.

for i in 1...10 {
    if i % 2 == 1 {
        continue
    }
    print(i) // 2 4 6 8 10
}

 

if문 : 실행코드가 한 줄이어도 중괄호 필수!

var x = 10
if x > 10 {
    print("10보다 큽니다")
} else {
    print("10이거나 10보다 작습니다")
}

 

if문에서 콤마는 &&의 의미를 가진다.

var y = 2

if 1 < y && y < 3 {
    print("y는 \(y)입니다")
}
if 1 < y, y < 3 {
    print("y는 \(y)입니다")
}

 

참고 : iOS프로그래밍기초(21년-2학기) 한성현 교수님 강의 및 강의 자료 변형, 요약