[Swift] 프로젝트의 선택적 바인딩 지원

개요



프로젝트의 보수로서, 강제 언랩 되고 있는 개소를 옵셔널 바인딩으로 변경해 나가고 싶다. 그 때의 체크 방법과 수정 방법을 정리합니다.

수정하고 싶은 부분



1. hoge! 같은 강제 언랩

옵셔널형의 변수를 비옵션널형으로서 사용하고 싶을 때(특정의 메소드로 인수로서 등), 강제 언랩을 해 사용하면, 만약 값을 취득할 수 없었던 경우에 크래쉬 해 버리는 등의 위험이 있다.

2. = nill 에서의 nill 체크
if 変数 = nill 에서 조기 return 시켜도, 그 변수를 사용할 때는 강제 언랩 하지 않으면 컴파일할 수 없다. (동작으로서는 문제 없지만, 강제 언랩하고 있는지 어떤지를 한눈에 알기 어렵기 때문에, 유지 보수의 용이성이라는 관점에서 변경하고 싶다. 기본적으로는 프로젝트의 방침에 맞춘다.)

그 때문에, 이하와 같은 대응으로 옵셔널 바인딩을 한다.

· guard-let 구문



원래 코드 1.swift
method(hoge!.image)

원래 코드 2.swift
if hoge.image == nil { return }
let image = hoge!.image
method(image)

수정 후 .swift
guard let image = hoge.image else { return }
method(image)

이 경우, hoge가 nil 로 image에 값이 들어가지 않는 경우(image에 nil이 들어 버리는 경우)에는 return에 의해 처리를 빠질 수가 있다.

또, 취득하고 싶은 값이 언랩 하고 싶은 변수 그 자체이었을 경우, 일부러 범위내 변수를 설정하지 않고, _ 를 이용해 옵셔널 바인딩만 하는 방법도 있다.

원래 코드.swift
method(hoge!)

수정 후 .swift
guard let _ = hoge else { return }
method(hoge)

여러 변수를 단번에 선택적 바인딩

어느 하나라도 값을 얻을 수 없으면 처리를 빠져 싶다! 라고 하는 때는, 일괄로 옵셔널 바인딩할 수 있다.

원래 코드 1.swift
method(a!, b!, c!)

원래 코드 2.swift
if a == nil || b == nil || c == nil { return }
method(a!, b!, c!)

수정 후 .swift
guard let a = a,
      let b = b,
      let c = c else { return }
method(a, b, c)

또, 다른 처리로 사용하는 변수라도, ​​같은 스코프내이면,
스코프의 최초에 일괄로 옵셔널 바인딩 하는 것이 쓸데없는 처리를 시키지 않아도 된다.

원래 코드.swift
guard let a = a else { return }
method1(a)

guard let b = b else { return }
method2(b)

guard let c = c else { return }
method3(c)

수정 후 .swift
guard let a = a,
      let b = b,
      let c = c else { return }

method1(a)
method2(b)
method3(c)

· If-Let 구문



값을 취득할 수 없으면 처리를 빠진다고 한다 guard-let 구문에 대해,
값을 취득할 수 있으면(자) 특정의 처리를 실시한다고 하는 기술을 할 수 있는 것이 If-Let 구문.

image를 취득할 수 있어도 할 수 없어도, method2() 는 달리고 싶다! 그렇다면,

guard-let.swift
guard let image = hoge.image else { return }
method1(hoge)

// imageが取得できなかった場合処理を抜けてしまうのでmethod2()は走らない
method2()

if-let.swift
if let image = hoge.image { method1(image) }

// imageが取得できなくてもmethod2()は走る
method2()

위와 같이, If-Let 구문을 사용하는 것으로, 값을 취득할 수 없어도 다음의 처리에 갈 수가 있다.

주의점



강제 언랩을 피함으로써, 취득하고 싶은 값이 어떠한 이유에 의해 취득할 수 없었던 경우, 크래시 시키지 않고 처리를 빠질 수 있다.

그러나, 유저측으로부터 하면 「화면은 정상인데, 조작해도 반응하지 않는다! 」라고 하는 상황이 되는 경우도 있다.

따라서 필요에 따라
  • 처리를 종료 할 때 경고를 표시하는 처리 추가
  • 강제 언랩의 결과, 굳이 충돌하여 결함이 발생한 상황을 밝히거나 더 이상 작동하지 않을 수 있습니다.

    등의 대응을 취하는 것도 생각한다.
  • 좋은 웹페이지 즐겨찾기