>source

swift-snapshot-testing 과 협력하고 있으며 Generic에 대한 문제를 발견했습니다 함수 매개 변수 기본값.

프레임 워크는 다음과 같은 방법을 제공합니다 :

func verifySnapshot<Value, Format>(matching value: Value,
                                   as snapshotting: Snapshotting<Value, Format>,
                                   snapshotDirectory: String? = nil) -> String?

여기서 Snapshotting  다음과 같은 일반적인 구조체입니다 :

struct Snapshotting<Value, Format> {}
extension Snapshotting where Value == UIViewController, Format == UIImage {
    static var image: Snapshotting<UIViewController, UIImage> {
      :
    }
}
extension Snapshotting where Value == UIView, Format == UIImage {
    static var image: Snapshotting<UIView, UIImage> {
      :
    }
}


도우미 메소드를 만들고 싶습니다.

func verify<Value, Format>(matching value: Value,
                           as snapshotting: Snapshotting<Value, Format>) {
    let snapshotDirectory = "/path"
    let failure = verifySnapshot(matching: value,
                                 as: snapshotting,
                                 snapshotDirectory: snapshotDirectory)
    print(failure ?? "Done!")
}


그러나 pyzwyz를주고 싶을 때  기본 매개 변수 값 snapshotting 오류 .image 에 대해 컴파일되지 않습니다.

Ambiguous reference to member 'image'

내 질문은 : 스위프트가 제네릭 형식 func verify<Value, Format>(matching value: Value, as snapshotting: Snapshotting<Value, Format> = Snapshotting<Value, Format>.image) 를 추론 할 수 있습니까?  기본 매개 변수 값은 무엇입니까?

Format

  • 답변 # 1

    여기의 주요 문제는 그 .image 입니다  모든 <Value, Format> 에 존재하는 것은 아닙니다  쌍. 그것은 <UIViewController, UIImage> 에 대해서만 존재합니다 및 <UIView, UIImage> . 여기에 기본값을 지정하려면 verify 가 사용하는 모든 방법에 적용 할 수 있어야합니다  호출 할 수 있습니다.

    기본 매개 변수는 항상 더 적은 수의 매개 변수로 별도의 함수로 표현 될 수 있으므로 기본값 대신 원하는 과부하를 추가하면됩니다.

    func verify(matching value: UIViewController) {
        verify(matching: value, as: .image)
    }
    func verify(matching value: UIView) {
        verify(matching: value, as: .image)
    }
    
    

  • 답변 # 2

    @Rob Napler의 답변 참조 인터페이스가 기본값 인 것처럼 보이도록 해결 방법을 만들었습니다.

    ///interface to accept snapshotting argument 
    func verify<Value, Format>(matching value: Value,
                               as snapshotting: Snapshotting<Value, Format>)
    ///interfaces to accept specific kind of value 
    func verify(matching value: UIView)
    func verify(matching value: UIViewController)
    :
    :
    
    
    

    그리고 우리는 그것을 호출 할 수 있습니다

    verify(matching: aView)
    
    

    또는

    verify(matching: aView, as: .image)
    
    

관련 자료

  • 이전 android - NotificationCompatBuilder setLargeIcon이 알림에 이미지를 표시하지 않습니다
  • 다음 angular - 내부 서버 오류 500, JSONJSON 데이터의 1 행 1 열에서 예기치 않은 JSON 구문 분석