2016-09-13 2 views
1

몇 가지 구조체가 있습니다. Foo, Bar, Baz 및 아래 함수를 사용하여 plist를 [String : Foo] 사전으로 읽습니다. 그리고 [String : Bar] 사전 등을 만드는 방법이 있습니다.이 모든 것이 잘 작동합니다.Swift의 일반 사전

func loadFoo() -> [String : Foo]? { 
    guard 
     let path = Bundle.main.path(forResource: "foo", ofType: "plist"), 
     let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject] 
     else { return nil } 

    var dict = [String : Foo]() 

    for (key, f) in plistDict { 
     if let info = f as? [String : AnyObject] { 
      let foo = Foo(symbol: key, info: info) 
      dict[key] = foo 
     } 
    } 

    return dict 
} 

물론 이것은 "generics 사용"이라고 비명을 지르기는하지만 아직 작동시키지 못했습니다. 예를 들어 Foo<A> 또는 A으로 바꿨지 만 컴파일러 오류가 발생합니다 (지금 당장은 Mac에서 멀리 떨어져 있으므로 여기에서 오류를 재현 할 수 없습니다).

이 문제를 해결하는 방법에 대한 제안이 있으십니까?

+0

'pList' 변수 란 무엇입니까? – Avt

+0

Xcode의 속성 목록. 아, 그리고 오타가있어서 고쳐 버렸어. – Koen

답변

2
  • 이제

    struct Baz : Fooable { ... 
    
  • 당신이 할 수있는 모든 구조체가 해당 프로토콜을 채택 모든 일반적인 구조체는 init(symbol:info:)

    protocol Fooable { 
        init(symbol: String, info: [String : AnyObject]) 
    } 
    
  • 이 확인 init 메소드를 구현하여 준수해야합니다 프로토콜 만들기 유형을 Fooable

    0으로 제한하여 일반로드 메소드
    func loadFoo<T:Fooable>() -> [String : T]? { 
        guard 
        let path = Bundle.main.path(forResource: "foo", ofType: "plist"), 
        let plistDict = NSDictionary(contentsOfFile: path) as? [String : AnyObject] 
        else { return nil } 
    
        var dict = [String : T]() 
    
        for (key, f) in plistDict { 
        if let info = f as? [String : AnyObject] { 
         let foo = T(symbol: key, info: info) 
         dict[key] = foo 
        } 
        } 
    
        return dict 
    } 
    
  • 및 유형에 주석을

    let bazObject : [String : Baz]? = loadFoo() 
    

    이 구문으로 호출은 일반 매개 변수로 Baz 전달합니다.

+0

그래서 어떻게 부를 수 있습니까? 'myFooDict = loadFoo()'가 작동하지 않습니다 ('unresolved identifier loadFoo'). – Koen

+1

구조체를 제네릭 매개 변수로 전달해야합니다. 'Baz' 구조체를 쓰고 있다고 가정하면'myFooDict = loadFoo ()' – vadian

+0

흠, 나는 여전히 같은 에러가 나옵니다. 'loadFoo'는 어디에 있습니까? 나는 Loadable의 확장으로서 그것을 시도하고, 위의 에러를 얻는다. 'Loadable '밖으로 이동하면 오류가 발생합니다 :'제네릭 함수를 명시 적으로 특수화 할 수 없습니다 '및'이것을 구문 분석하는 동안 '을'형식 매개 변수 괄호 '로 사용합니다. – Koen