2016-12-10 3 views
1

다음 코드를 고려 인스턴스화 할 수없는 내가 프로토콜의 기능을하고 싶습니다,프로토콜 유형이

Ball(color: UIExtendedGrayColorSpace 1 1) 

지금을, 즉 주어진 색상 배열을 사용하면 해당 색상의 항목 배열 (공, 또는 Color에 부합하는 다른 유형)을 반환합니다.

extension Color { 
    func multipleColors(colors: [UIColor]) -> [Color] { 
     var coloredItems = [Color]() 
     for item in colors { 
     // What do I put here ??? 
     } 

     return coloredItems 
    } 
} 

다음 :

let coloredBalls = ball.multipleColors(colors: [.red, .green, .blue]) 

대괄호 안에 무엇을 넣을지 알 수 없습니다.

'Color' cannot be constructed because it has no accessible initializers 

내가 다음 프로토콜에 init 메소드를 추가하고, 오류가 변경 :

coloredItems.append(Color(color: item)) 

오류가 있습니다 : 예 (웃기), 나는 시도하는 경우

protocol type 'Color' cannot be instantiated 

어떻게 해결할 수 있습니까?

+1

당신은'컬러 프로토콜의 인스턴스를 만들기 위해 노력하고 있습니다. – shallowThought

+0

그래서 어떤 생각을 어떻게 바꿀 수 있습니까? – Koen

+0

'multipleColors' 함수의 출력 결과가 정확히 무엇인지 예상 할 수 없습니다. 여기서 해결하려는 실제 문제는 무엇입니까? – Hamish

답변

1

불가능한 프로토콜 Color(color: item)의 인스턴스를 만들려고합니다.

아래에서 가능한 일반적인 솔루션을 찾으십시오. 지금까지는 비 정적 (멋진) 솔루션을 찾을 수 없었습니다.

protocol Color { 
    var color: UIColor {get set} 
    init(color: UIColor) 
} 

struct Ball : Color { 
    var color: UIColor 
} 

extension Color { 
    static func item<T:Color>(_ item: T, inColors colors: [UIColor]) -> [T] { 
     var coloredItems = [T]() 
     for color in colors { 
      let newColoredItem = T.init(color: color) 
      coloredItems.append(newColoredItem) 
     } 

     return coloredItems 
    } 
} 

let ball = Ball(color: .white) 
let coloredBalls = type(of:ball).item(ball, inColors: [.red, .green, .blue]) 

print(coloredBalls) 

인쇄는 : 가능하지 않은, (제품 색상)`

[Ball(color: UIExtendedSRGBColorSpace 1 0 0 1), Ball(color: UIExtendedSRGBColorSpace 0 1 0 1), Ball(color: UIExtendedSRGBColorSpace 0 0 1 1)] 
+0

나는이 해결책을 좋아하고 질문에 답하기 때문에 그것을 받아 들일 것이다. 그러나 'Ball'은 '크기'(명확성을 위해 생략)와 같은 속성을 더 많이 가지고 있으며, 또한 'coloredItems'에 전달되어야합니다. – Koen

+0

나는 이것을 다소 이론적 인 예라고 생각했다. 실제로는 수업을 사용하십시오. 'alicesBall === bobsBall'을 알고 싶습니다. 또한 나는'색'을 삭제할 것이다. 클래스 ColoredItem {var color : UIColor func multipleColors() ...}을 만듭니다. 그리고 그것을 서브 클래스 화하십시오. – shallowThought

+1

또한'copy' 함수를 호출하여'T.init()'대신'T.copy()'를 사용할 수 있습니다. – shallowThought