[Swift 디자인 패턴2] Iterator

2014-11-17
5 Views

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

You may be interested

Xcode 기능 확장(Extension) 제거하기
Xcode
shares3 views
Xcode
shares3 views

Xcode 기능 확장(Extension) 제거하기

MJ Kim - 3월 18, 2017

Mac에서 Xcode Source Editor Extension등의 기능확장을 사용하다보면 디버깅시 시스템 환경 설정의 확장이 앱에 등록되는 경우가 있다. 계속해서 목록이 남아 있기…

iOS App Store Review(앱 심사약관) 번역
Swift 3.0
shares112 views
Swift 3.0
shares112 views

iOS App Store Review(앱 심사약관) 번역

MJ Kim - 3월 15, 2017

App Store Review를 번역했다. 사실 이번에 좀 애매한 리젝을 당해서 그걸 이해하고자 정리해본다. 원문링크: https://developer.apple.com/app-store/review/guidelines/ 1. 이약관은? 1.1 앱 개발자로서 프로그램의…

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi
IoT by Raspberry Pi
shares8 views
IoT by Raspberry Pi
shares8 views

Raspberry Pi 타이머 On/Off 전원제어모듈 RPi1114-Raspberry Pi

MJ Kim - 3월 04, 2017

RPi1114-Raspberry Pi전원제어 모듈이 있다. 이 제품은 40Pin GPIO핀헤더에 연결하여 사용하는 모듈로 Cortax-M0마이크로컨트롤러 LPC1114를 내장하고 Raspberry Pi의 시작과 정지 순서등을 프로그래밍할…