Swifter {Swift Developer}

메뉴

[Swift 디자인 패턴2] Iterator

Iterator

Iterator는 다음과 같은 의미가 있습니다.

  • 반복자

Iterator패턴은 요소 집합을 보유하는 개체의 각 요소에 차례대로 접근하는 방법을 제공하기 위한 패턴입니다.

클래스 다이어그램

class-diagram-iterator

 

  • Aggregate, Iterator클래스는 모두 추상 클래스
  • 추상 클래스는 각각 ConcreteAggregate, ConcreteIterator클래스
  • Aggregate클래스가 iterator메소드 Iterator클래스 인스턴스를 생성

Aggregate = 집합체, Conctete = 구체화

예제

Aggregate

[swift]

class Aggregate {

func Iterator() -> Iterator {

fatalError("must be overridden")

}

}

[/swift]

Aggregate는 추상클래스로 메소드가 호출되면 fatalError를 실행하고 프로그램을 종료하도록 하고 있습니다. 이 메소드는 서브클래스에서 구현되는 것을 상정하고 있습니다.

Iterator

[swift]

class Iterator {

func next() -> AnyObject {

fatalError("must be overridden")

}

func hasNext() -> Bool {

fatalError("must be overridden")

}

}

[/swift]

이것도 추상 클래스입니다.

ConcreteAggregate

[swift]

class ConcreteAggregate : Aggregate {

private var items = [Item]() //1

override func Iterator() -> Iterator { //2

return ConcreteIterator(aggregate : self)

}

func addItem(item : Item) {  //3

items.append(item)

}

fun countOfItems() -> Int { //4

return items.count

}

func itemAtIndex(index : int) -> Item { //5

return items[index]

}

}

[/swift]

  1. 배열 초기화를 합니다. 배열을 구성하는 요소 형은 “item”입니다.
  2. iterator메소드를 구현합니다. 초기화 메소드 인수에 자신을 보냅니다.
  3. 멤버 변수 배열에 Item클래스 인스턴스를 추가합니다.
  4. 멤버 변수 배열 요소 수를 리턴합니다.
  5. 멤버 변수 배열에서 인수로 보낸 인덱스 요소를 리턴합니다.

ConcreteIterator

[swift]

class ConcreteIterator : Iterator {

private var aggregate : ConcreteAggregate //1

private var index = 0 //2

init(aggregate : ConcreteAggregate) { //3

self.aggregate = aggregate

}

override func next() -> AnyObject {  //4

return aggregate.itemAtIndex(index++)

}

override func hasNext() -> Bool {  //5

return aggrecrete.countOfItems() > index

}

}

[/swift]

  1. ConcreteAggregate 인스턴스를 유지합니다
  2. 반복을 위한 인덱스를 유지합니다.
  3. 초기화 메소드
  4. 요소를 가져옵니다.
  5. 다음 요소가 존재하는지 확인합니다.

Item

[swift]

// 클래스 다이어그램에는 없고, 샘플실행을 위한 보조 클래스임

class Item {

private var _name : String //1

var name: String { // 2

get { return _name }  //3

}

init(name: String) { //4

_name = name

}

}

[/swift]

  1. 공통 변수 name을 readonly로 처리하기 위해 _name이라는 private변수를 만듭니다.
  2. 공통 변수 name을 선언합니다.
  3. getter로 ser { ~}와 setter를 선언하지 않으면 공통변수 name은 readonly가 됩니다.
  4. 초기화 메소드입니다.

 

실행 소스코드

[swift]

var ca = ConcreteAggregate()

ca.addItem(Item(name: "item1"))

ca.addItem(Item(name: "item2"))

ca.addItem(Item(name: "item3"))

ca.addItem(Item(name: "item4"))

ca.addItem(Item(name: "item5"))

let it = ca.iterator()

while it.hasNext() {

let item = it.next() as Item

println(item.name)

}

[/swift]

  • 강제로 프로그램을 종료하고 싶을 때는 fatalError를 사용
  • 배열 초기화는 “var 변수명 = [형식]()”로 선언
  • 메소드를 재정의하는 경우 override키워드를 추가함
  • getter, setter는 get { ~}, set {~}를 추가

 

Swift에서 사용되는 예제

[swift]

fot 요소 in 집합 {

// 요소에 대한 처리

}

[/swift]

Array

[swift]

let names = ["Kim". "Lee", "Song"]

for name in names {

println(name)

}

[/swift]

Dictionary 

[swift]

let mobiles = ["1":"iOS","2":"Android","3":"FirefoxOS"]

for (key, value) in mobiles {

println("(key) = (value)")

}

[/swift]

Dictionary의 for~in은 순서가 보장되지 않기 때문에 주의해야 합니다.

String

[swift]

ley String = "Welcome to Korea"

for character in String {

println(character)

}

[/swift]

 

Facebook Comments

카테고리:   Swift Books

댓글

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