2016-06-07 2 views
1

저는 신속한 답변을 드리지 못하고 반환 유형에 문제가 있습니다. 동일한 클래스의 인스턴스를 반환해야하는 클래스/형식 메서드가 있습니다. 내가 이해하는 바와 같이, instancetypes를 반환하는 것은 출신 Swift 행동이 아닙니다. 다음은 내가 한 일의 코드 예입니다.왜 자기에 액세스 할 수 없습니까?

public class CustomView: UIView { 

    class func createCustomView(arguments: Array) -> Self { 
    return createCustomViewInternal(arguments) 
    } 

    private class func createCustomViewInternal<T>(arguments: Array) -> T { 

    return CustomView(frame: CGRectZero).createCustomViewInstance(arguments) as! T 
    } 

    private func createCustomViewInstance(arguments: Array) -> Self { 

    //Do customization here. 
    ---> return self 
    } 

표시된 지점에서 자체 액세스 할 수 없습니다. 또한 프로그래밍 방식으로 제약 조건을 추가하려고하면 컴파일러 오류가 발생합니다. " 'Self'형식을 'AnyObject?'라는 예상 인수 형식으로 변환 할 수 없습니다." 나는 어디로 잘못 갔는가?

instancetype을 반환하는 것은 Objective-C에서 훨씬 간단했을 것입니다. 자기를 돌려 보내는 더 간단한 방법이 있습니까?

+3

왜 '-> CustomView'가 아닌가? – Thilo

+0

@Thilo Obj-C 디자인 언어의 줄에 일반 메서드를 작성하려고했습니다. 어쨌든, 그것이 효과를 낼 것입니까? 자아가 액세스 될 때까지 우리는 아무 것도 반환하지 않았습니다. 방금 시도했지만 아무런 차이가 없습니다. ( – Aswath

+0

클래스 함수와 generic 매개 변수의 용도는 무엇입니까? 간단한 초기화 함수가있는 이유는 무엇입니까? – Wain

답변

1

그래서 UIView에서 하위 클래스를 만들려고합니다.

셀프 대신 구체적인 클래스를 사용할 수 있습니다. Self는 오버라이드하고 싶지 않을 때 서브 클래 싱에만 관련됩니다. Self 대신 CustomView를 사용하면 많은 일이 더 쉬워집니다.

두 가지 대신 하나의 클래스 메서드를 사용할 수 있습니다.

이 사용자 정의 방법 대신 init 메소드를 무시할 수 있습니다.

import UIKit 

public class CustomView: UIView { 
    public var property: Int = 0 

    public required override init(frame: CGRect) { 
     super.init(frame: CGRectZero) 
    } 

    required public init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    public class func createCustomView(param: Int) -> Self { 
     return createCustomViewInternal(param) 
    } 

    private class func createCustomViewInternal(param: Int) -> Self { 
     return self.init(frame: CGRectZero).createCustomViewInstance(param) 
    } 

    private func createCustomViewInstance(param: Int) -> Self { 
     self.property = param 

     return self 
    } 
} 

사이드 참고 :

인수 콘크리트 주어진 값입니다 당신 정말가 그런 식으로해야하는 경우

는하지만, 여기에 작동하는 솔루션입니다. 메소드에서 추상 값을 사용할 때이를 매개 변수라고합니다.

관련 문제