Swifter {Swift Developer}

메뉴

Swift 3.0에서는 for문을 사용할 수 없다

[vc_row][vc_column][vc_column_text]Swift가 현재 오픈소스로 공개되면서 Swift 2.x에서 3.x버전으로 올라가게 되면 어떤 변화가 있는지 확인이 가능해졌습니다. 버전이 올라가게 될 때 포함되는 기능이나 삭제되는 기능이 어떻게 결정되는가를 살펴보면 다음과 같은 형태로 정해지는 것 같습니다.

  1. 제안
  2. 리뷰
  3. 채택

이런 제안은 애플사 내부뿐만아니라 애플 외부 사용자들의 제안도 가능하게 되어 있습니다. 이런 제안에서 특히 상징적으로 확인된 것중 하나가 C-Style의 for문 제거라는 것인데 Swift 3.0에서는 삭제되는 것으로 공식적으로 정해졌습니다.

이 제안(Proposal)은 Erica Sadun의 제안으로 진행된 것으로 구체적으로 이야기하면 다음과 같은 구문은 사용할 수 없게 된다는 것입니다.

[/vc_column_text][vc_column_text]

[code lang=”swift”]
for var i=0; i<99; i++ {
print("(i)")
}
[/code]

[/vc_column_text][vc_column_text]Objective-C언어에서는 주로 사용하던 스타일로 이것이 없어진다면 기존 Objective-C언어나 C언어를 공부하거나 이를 통해 앱개발을 하던 개발자들은 Swift언어로 넘어올때 오류를 자주 범하게 될 가능성이 있습니다. 그리고 이미 Swift언어로 개발을 하는 개발자들이라면 이런 스타일로 많이 코딩하고 있다고 보여집니다.

그렇지만 익숙한 구문을 없어지게 하여 아예 사용하지 못하게 하는 것인가?라는 의문을 가지게 하지만 사용할 수 있다고 말하고 싶습니다. 물론 앞으로 Swift언어로 코딩을 하는 개발자라면 이런 점들을 고려하여 Swift 3.0이 발표된 이후 그에 따른 수정을 나중에 고생해서 하는 것보다는 지금부터 고려해서 코딩하길 바랍니다.

이전까지는 WWDC에서 발표될 때까지 어떤 변화가 있는지 확인하기 어려웠지만, 오픈소스화되면서 미리 대책을 세울 수 있게 되었다는 것입니다.[/vc_column_text][vc_custom_heading text=”예제” use_theme_fonts=”yes”][vc_column_text]일반적인 for문 (Swift 3.0에서는 아래 구문을 사용할 수 없습니다)

[code lang=”swift”]
for var i=0; i<99; i++ {
print("(i)")
}
[/code]

앞으로는 for-in을 사용하여 해결이 가능합니다.

[code lang=”swift”]
for i in 0..<99 {
print("(i)")
}
[/code]

또는 다음과 같은 forEach로 해결할수도 있습니다.

[code lang=”swift”]
Array(0..<99).forEach{print("($0)")}
[/code]

이처럼 간단한 형태라면 기존 for문보다 간결하게 작성할 수 있습니다.

[/vc_column_text][vc_column_text]만약, 배열 인덱스가 중요할 경우, 예로 홀수 인덱스 요소만 사용한다면 어떻게 해야할까?
Swift 3.0에서는 사용할 수 없는 기존 방식

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for var i=0; i<arr.count; i++ {
if(i%2) != 0 {
print("(arr[i])")
}
}
[/code]

이를 다시 for-in을 사용하면, 배열이 독특한 요소로만 구성되어 있는 경우에만 가능합니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for s in arr {
if let ix = arr.indexOf(s) {
if(ix%2) != 0 {
print("(arr[ix])")
}
}
}
[/code]

단, 중복 요소가 있을 경우, indexOf는 정확한 인덱스를 얻을 수 없습니다. 인덱스에 따라 요소를 얻으려면, stride를 사용하는 것이 좋다고 생각됩니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for i in 1.stride(to: arr.count, by: 2) {
print("(arr[i])")
}
[/code]

그리고 enumerate는 인덱스와 요소의 튜플의 배열을 생성해주는 SequenceType에 정의된 메소드입니다.
기존 방법은 다음과 같이 사용합니다. (이것은 Swift 3.0에서는 사용할 수 없습니다)

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
for (ix, emt) in arr.enumerate() {
if (ix%2) != 0 {
print("(emt)")
}
}
[/code]

이를 for-in을 사용하지 않고 다음과 같이 작성해서 해결할 수 있습니다.

[code lang=”swift”]
let arr = ["a", "b", "c", "d", "e"]
arr.enumerate().filter { ($0.0%2 != 0)}.map{$0.1}
arr.enumerate().flatMap { ($0.0%2 != 0) ? $0.1 : nil}
[/code]

타이틀은 for문이 없어진다라고 했지만, map과 filter, enumerate등이 새로운 것이 이지만 swift언어의 표준 라이브러리에 포함되어야 것을 이용하면 그다지 문제는 없습니다. 이제부터라도 앞으로 Swift 3.0을 위해 C언어스타일의 for문 코딩을 줄이기 바랍니다.[/vc_column_text][/vc_column][/vc_row]

Facebook Comments

카테고리:   Swift

댓글

죄송하지만 댓글은 닫혀 있습니다.