처음부터 차근차근

Swift 문법 복습4 본문

프로그래밍/Swift

Swift 문법 복습4

_soyoung 2022. 3. 29. 18:28
반응형
var x : Int! = 10 // 선언문에서 ?는 옵셔널 변수 선언
print(x)
//print(x!) // 실행문에서 느낌표는 강제 언래핑
if x != nil { // !는 그냥 쓰면 위험(x에 nil들어가면 crash남). 그래서 if문 사용해서 언래핑해줌
    print(x!) // ! 옵셔널 변수는 옵셔널로 사용되지 않으면 자동으로 옵셔널을 푼다.
}
    
// 옵셔널 바인딩
if let xx = x {
    print(x, xx)
}

var a : Int?
var y = a ?? 0 // a에 nil이 들어가있으면 0을 y에 대입한다.
print(a, y)

//optional chaning
//실행문에서 ?를 쓰는 것

//Optional(10)
//10
//Optional(10) 10
//nil 0






var x : String? = "Hi" // Hi 지우고도실습 : 지우면 아래의 x! 때문에 crash남
print(x, x!)
if let a = x {
    print(a)
}
let b = x!.count
print(type(of:b),b)
let b1 = x?.count
print(type(of:b1),b1, b1!)
let c = x ?? "" 
print(c)
//Optional("Hi") Hi
//Hi
//Int 2
//Optional<Int> Optional(2) 2
//Hi






class Person { 
    var name : String? 
    var age : Int?
    var sns : SNS? = SNS()
}

class SNS {
    var fb : FaceBook? = FaceBook()
    var tt: Twitter?
}

class FaceBook{
    var account : String = "aaa@bbb.com"
}

class Twitter {
    var account : String = ""
}

let p = Person()
if let s = p.sns {
    if let f = s.fb {
        print("1: \(f.account)")
    }
}

// 제일 좋은 방법
if let account = p.sns?.fb?.account {//옵셔널 체이닝 결과는 옵셔널 값이므로 다시 한 번 옵셔널 바인딩
    print("2: \(account)")
}
print("3: \((p.sns?.fb?.account)!)")//옵셔널체이닝,비추
print("4: \(p.sns!.fb!.account)")
print("5: \(p.sns?.tt?.account)")  //nil : 옵셔널 체이닝을 쓰는 이유! crash가 나지 않음
//print("6: \(p.sns!.tt!.account)") // crash
//1: aaa@bbb.com
//2: aaa@bbb.com
//3: aaa@bbb.com
//4: aaa@bbb.com
//5: nil






func myPrint(a: Int, b: Int) {
    print(b,a)
}
myPrint(a:1,b:2) // 2 1
//myPrint(a:2.5,b:3.5) // 오류




func myPrint<T>(a: T, b: T) { // generic
    print(b,a)
}
myPrint(a:1,b:2) // 2 1
myPrint(a:2.5,b:3.5) // 오류 안남!
myPrint(a:"aa",b:"bb") // 오류 안남!
//2 1
//3.5 2.5
//bb aa





func swapAll<T>(_ a: inout T, _ b: inout T) {
    let temp = a
    a = b
    b = temp
}

var x = 10
var y = 20
swapAll(&x, &y)
print(x,y)

var xd = 10.3
var yd = 20.7
swapAll(&xd, &yd)
print(xd,yd)

var xs = "Hi" 
var ys = "Hello"
swapAll(&xs, &ys)
print(xs,ys)
//20 10
//20.7 10.3
//Hello Hi









let number = [1,2,3,4]   //타입추론
let odd : [Int] = [1,3,5] 
let even : Array<Int> = [2,4,6]
print(type(of:number)) //Array<Int>
print(number)//[1, 2, 3, 4]
print(type(of:odd)) 
print(odd)
print(type(of:even)) 
print(even)
let animal = ["dog","cat","cow"]
print(type(of:animal))//Array<String>
print(animal)

//Array<Int>
//[1, 2, 3, 4]
//Array<Int>
//[1, 3, 5]
//Array<Int>
//[2, 4, 6]
//Array<String>
//["dog", "cat", "cow"]






var x = [0,0,0,0,0]
print(x)
var x1 = Array(repeating:0,count:5)
print(x1)
var x2 = [Int](repeating:1,count:3) 
print(x2)
var x3 = [String](repeating:"A",count:4) 
print(x3)
//[0, 0, 0, 0, 0]
//[0, 0, 0, 0, 0]
//[1, 1, 1]
//["A", "A", "A", "A"]












var number : [Int] = []
//number[0]=1 //crash, 방을 만들지 않았기 때문에 오류가 남
number.append(1)
print(number)
number[0] = 10
print(number)
//[1]
//[10]






struct IntStack<T> {
    var items = [T]()
    mutating func push(_ item: T) {
        items.append(item)
    }
    mutating func pop() -> T {
        return items.removeLast()
        
    }
}
//구조체는value타입이라메서드안에서
//프로퍼티값변경불가
//mutating 키워드를쓰면프로퍼티값변경가능
var stackOfInt = IntStack<Int>()
print(stackOfInt.items) //[]
stackOfInt.push(1)
print(stackOfInt.items) //[1]
stackOfInt.push(2)
print(stackOfInt.items) //[1,2]
stackOfInt.push(3)
print(stackOfInt.items) //[1,2,3]
print(stackOfInt.pop()) //3
print(stackOfInt.items) //[1,2]
print(stackOfInt.pop()) //2
print(stackOfInt.items) //[1]
print(stackOfInt.pop()) //1
print(stackOfInt.items) //[]

var stackOfDouble = IntStack<Double>()
print(stackOfDouble.items) //[]
stackOfDouble.push(1.5)
print(stackOfDouble.items) //[1]
stackOfDouble.push(2.5)
print(stackOfDouble.items) //[1,2]
stackOfDouble.push(3.6)
print(stackOfDouble.items) //[1,2,3]
print(stackOfDouble.pop()) //3
print(stackOfDouble.items) //[1,2]
print(stackOfDouble.pop()) //2
print(stackOfDouble.items) //[1]
print(stackOfDouble.pop()) //1
print(stackOfDouble.items) //[]
//[]
//[1]
//[1, 2]
//[1, 2, 3]
//3
//[1, 2]
//2
//[1]
//1
//[]
//[]
//[1.5]
//[1.5, 2.5]
//[1.5, 2.5, 3.6]
//3.6
//[1.5, 2.5]
//2.5
//[1.5]
//1.5
//[]

 

옵셔널 체이닝

실행문에서 '?' 쓰는 것

성공하면 optional값이 나오고
실패하면 nil값이 나온다.

 

!와 ?의 차이점 중요!

 

예외 처리

fileTypeHint utiString: String?) throws

 

위와 같이 throws라는 키워드가 있는 함수가 있음

throws라는 키워드가 있는 함수를 쓸 때는 그냥 쓰면 안되고
do ~ try ~ catch문을 써서 error handing해야한다. 

앞에다 try를 쓰고, do로 묶어서 catch로 받아야한다.

 

Array

An ordered, random-access collection.
Declaration
@frozen struct Array<Element>

 

Structer

  • structer
  • generic structer

 

 

 

 

출처 : iOS프로그래밍실무(22-1학기)한성현교수 강의 내용 변형 및 요약

반응형

'프로그래밍 > Swift' 카테고리의 다른 글

간단한 앱 만들기 실습  (0) 2022.04.16
Swift 문법 복습5  (0) 2022.04.11
Swift 문법 복습3  (1) 2022.03.26
Swift 문법 복습2  (1) 2022.03.18
Swift 문법 복습1, json 정리 사이트  (0) 2022.03.17
Comments