iOS/swift

Swift - nil & Optional (물음표, 느낌표)

돌맹이시터 2021. 6. 12. 20:10

 

stack overflow 혹은 swift documentation에서 !,? 을 심심치 않게 볼 수 있는데

그 부분에 대한 정리를 한다.

 

 

 

 

nil & optional

 

 

먼저 nil에 대해 정리가 필요하다. (nil : nonexistent)

변수는 값이 없는 상태로 시작하게 될 수도 있다. 

하지만 이런 상황에서 해당 변수를 가지고 무언가 하려고 할 때 충돌이 일어날 수 있다.

이런 상황이 발생하는 것을 방지하기 위해 사용하는 것이 optional의 개념이다.

 

 

예를 들어, 

앱에서 어떤 영역에 username을 저장하고자 할 때, 처음 값을 입력하지 않는 경우

username은 비어있게 될 수도, 혹은 user로부터 입력받아서 채워져있을 수도 있다.

Swift에서는 이런 불확실한 상황을 표현하기 위해 'optional' 이라는 개념을 사용한다.

 

 

ex)

 

var varName : String

-> varName 변수에 String 자료형을 저장할 수 있다.

 

var varName : String?

-> varName 변수에 String 자료형을 저장하거나, 비어있을 수 있다.(data가 없거나, nil을 저장한다)

 

 

 

 

만약 현재는 비어있는 변수를 선언하고자 한다면

 

var varName : String = nil

이라고 선언하게 된다면 에러가 발생한다.

 

var varName : String? = nil

이렇게 자료형 뒤에 물음표를 붙여 선언한다면 optional이 되면서, 에러가 발생하지 않게 된다.

 

 

이 코드를 출력해보면,

 

 

debug area에 "optional" + "("string")"이 출력된다.

 

optional에서 normal string으로 돌려놓는 방법은 여러 가지가 있는데,

 

 

1. 강제로 unwrap하는 방법 (safety check을 무시하는 방법)

 

print (player1Username!)

처럼 변수 뒤에 !를 붙여서 강제로 unwrap 해준다.

 

safety check을 무시하는데, 

nil값을 가지고 무언가를 하려고 할 때 발생하는 문제를 방지할 수 없게 된다.

 

 

따라서,

이 방법을 사용하는 경우 수동적으로 safety check를 해야 한다.

해당 변수가 정말 nil이 되지는 않는지 스스로 점검하는 과정이 필요하다.

 

머리를 잘 굴려보거나, if 문을 이용하면 된다.

 

 

if player1Username != nil {

    print (player1Username!)

}

이런 식으로 코드를 구성해주면 해결된다.

만약 nil이라면 해당 코드는 스킵되기 때문이다.

 

if로 인해 보호된다고 볼 수 있다.

 

 

 

 

 

 

 

 

Challenge )

 

//Don't change this
var studentsAndScores = ["Amy": Int(readLine()!)!, "James": Int(readLine()!)!, "Helen": Int(readLine()!)!]

func highestScore(scores: [String: Int]) {
  
  //Write your code here.
  
  
  
}

 

위의 코드를 수정하여, dictionary에서 가장 높은 점수의 값이 출력되도록 할 것

dictionary에서 value를 꺼낼 때 optional을 사용하는 것이 필요하다.

 

 

 

//Don't change this
var studentsAndScores = ["Amy": Int(readLine()!)!, "James": Int(readLine()!)!, "Helen": Int(readLine()!)!]

func highestScore(scores: [String: Int]) {
    
    //Write your code here.
    var highScore = 0
    
    let score1 = studentsAndScores["Amy"]!
    let score2 = studentsAndScores["James"]!
    let score3 = studentsAndScores["Helen"]!
    
    if score1 > highScore {
        highScore = score1
    }
    if score2 > highScore {
        highScore = score2
    }
    if score3 > highScore {
        highScore = score3
    }
    
    print(highScore)
    
}

'iOS > swift' 카테고리의 다른 글

Swift - structure (구조체)  (0) 2021.06.23
swift5 - sound play with simple code  (0) 2021.06.15
Swift - Dictionary  (0) 2021.06.12
Swift 조건문 : If - Else & Switch  (0) 2021.06.11
swift - print (출력함수) 예시  (0) 2021.05.29