2016-10-11 3 views
0

없는 모호한 순서 나는 원시 데이터 클래스를 통해 래퍼 abcContainer을 반환하는 사용자 정의 반복자를 만들려고 abc스위프트 3 - 더 상황

// raw data class 
class abc { 
    var name : String = ""; 
    init(_ value : String) { 
     name = value; 
    } 
} 

// with container, only "name" is to be visible 
class abcContainer { 
    private var _abc : abc; 
    init(_ obj : abc) { 
     _abc = obj; 
    } 
    // + extra methods here 
    func getName() -> String { 
     return _abc.name 
    } 
} 

점은 사전 abcContainer의 인스턴스를 반환하는 대신 단지 것이 될 것이다 일반 raw abc 클래스입니다.

나는 변환이 자동으로 확인하기 위해 일련의 프로토콜을 사용하고 싶어하지만, 나는 다음과 같이 자동으로 [String:abc] [String:abcContainer]로 변환 할 수 없습니다 : 아마 여기에 아주 기본적인 뭔가를 누락

// the iterator is implemented just iterating the inner basic dict 
// but wrapping the result value as abcContainer 
class abcIterator : Sequence, IteratorProtocol { 

    private var __source : [String:abc]?; 
    var index = 0 
    var myIterator : DictionaryIterator<String, abc>; 

    init(_ ctxArray: [String:abc]) { 
     self.__source = ctxArray 
     index = 0; 
     myIterator = (__source?.makeIterator())! 
    } 

    func next() -> abcContainer? { 
     let nextItem = myIterator.next(); 
     if(nextItem != nil) { 
      return abcContainer((nextItem?.value)!); 
     } 
     return nil; 
    } 
} 

// this was supposed to be the wrapper over the collection 
class abcCollection : Sequence { 

    private var __source : [String:abc]?; 

    init(_ list: [String:abc]) { 
     self.__source = list 
    } 

    func makeIterator() -> abcIterator { 
     return abcIterator(self.__source!); 
    } 
} 

. 나는이 같은 컬렉션을 사용하려고하면 :

var dict : [String:abc] = [String:abc](); 
    dict["abba"] = abc("John Smith"); 

    for (key,value) in abcCollection(dict) { 
     print(key, value.getName()); 
    } 

을 나는 오류가 발생합니다 : 표현 형식 "abcCollection는"

사람이 작동하는 방법을 생각을 가지고 있는가보다 컨텍스트없이 모호? 없어진 물건 있어요? 난 당신이 직접 단지 같은 링크 대답 할 좋아 반복자를 정의 할 수,

Swift 2 to 3 Migration for Swift Sequence Protocol

답변

2

원래 코드의 문제는 abcCollection(dict)abcContainer 객체의 순서를 반환한다는 것입니다, 그는 (key, value) 튜플에 할당 할 수 없습니다 수 있습니다.

당신은

class abcCollection : Sequence { 

    private var __source : [String:abc] 

    init(_ list: [String:abc]) { 
     self.__source = list 
    } 

    public func makeIterator() -> AnyIterator<(AnyObject,abcContainer)> { 
     let mapped = self.__source.lazy.map { 
      ($0.key as AnyObject, abcContainer($0.value)) 
     } 
     return AnyIterator(mapped.makeIterator()) 
    } 
} 

__source 비를 선택 사항으로 목표를 달성 할 수있는 모든 (옵션) 중복 을 unwrappings 만들고, lazy.map { ... }는 형 - 인 키/값 쌍의 게으르게 평가 순서를 반환 문질러 지우는.

+0

고마워요! 좋은 미묘한 점. –

2

좋아, 아마 대답은 abcIterator이 필요하지이었다 ...이 대답은 내가 필요로하는 정보를 가지고 있다는 느낌이 이 :

class abcCollection : Sequence { 

    private var __source : [String:abc]?; 

    init(_ list: [String:abc]) { 
     self.__source = list 
    } 

    public func makeIterator() -> AnyIterator<(AnyObject,abcContainer)> { 

     var it = self.__source?.makeIterator(); 
     return AnyIterator { 
       let n = it?.next(); 
       if n == nil { return nil } 
       return (n?.key as AnyObject, abcContainer((n?.value)!)) 
     } 

    } 
} 

그런 다음 사용자 지정 컬렉션에서 올바르게 래핑 된 개체를 반환했습니다.