신속한 질문: 프로토콜 유형인 경우 if else 블록에서 선택적이 아닌 변수를 어떻게 초기화할 수 있습니까?

매트

Swift에서는 선택 사항이 아닌 변수를 즉시 초기화하지 않고 나중에 if else 블록에서 초기화할 수 있습니다. 예를 들면 다음과 같습니다.

let result: Bool
if something {
   result = computeSomething()
} else {
   result = computeSomethingElse()
}

하지만 내 변수가 프로토콜 유형이면 어떻게 될까요? (내 예에서는 프로토콜인 GraphQLMutation을 사용하여 이 작업을 수행하고 싶습니다.)

let mutation: GraphQLMutation
if something {
   mutation = StartMutation()
} else {
   mutation = StopMutation()
}
self.graphQLDataSource.set(mutation: mutation)

Swift 컴파일러 오류는 다음과 같이 말합니다. Protocol 'GraphQLMutation' can only be used as a generic constraint because it has Self or associated type requirements

이 작업을 수행하고 코드 반복을 피할 수 있는 아이디어가 있습니까?

필립

프로토콜과 함께 작동합니다.

protocol Foo {}
struct A: Foo {}
class B: Foo {}

let x: Foo
if Bool.random() {
    x = A()
} else {
    x = B()
}

연결된 유형이 있는 프로토콜에서는 작동하지 않습니다. 일반 함수에서만 사용할 수 있습니다. 다음은 이를 보여주는 몇 가지 코드입니다.

protocol Foo {
    associatedtype T
}
struct A: Foo {
    typealias T = Int
}
class B: Foo {
    typealias T = String
}

func x<Foo>(_ test: Bool) -> Foo? {
    let x: Foo?
    if test {
        x = A() as? Foo
    } else {
        x = B() as? Foo
    }
    return x
}

let a1: A? = x(true)  // => A
let a2: A? = x(false) // => nil

let b1: B? = x(true)  // => nil
let b2: B? = x(false) // => B
  • 들어 a1우리의 인스턴스를 얻을 A캐스트로 A() as? Foo는 유형이 있기 때문에 일 Foo연관된 유형 Int에 의해 요구를 let a1: A?.

  • 들어 a2우리가 전무을 얻을 캐스트로 B() as? Foo이로 캐스팅 할 수 없기 때문에 실패 Foo연관된 유형 Int에 의해 필요합니다 let a2: A?.

  • 들어 b1우리가 전무을 얻을 캐스트로 A() as? Foo이로 캐스팅 할 수 없기 때문에 실패 Foo연관된 유형 String에 의해 필요합니다 let b1: B?.

  • 들어 b2우리의 인스턴스를 얻을 B캐스트로 B() as? Foo는 유형이 있기 때문에 일 Foo연관된 유형 String에 의해 요구를 let b2: B?.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

TOP 리스트

  1. 1

    Ionic 2 로더가 적시에 표시되지 않음

  2. 2

    JSoup javax.net.ssl.SSLHandshakeException : <url>과 일치하는 주체 대체 DNS 이름이 없습니다.

  3. 3

    std :: regex의 일관성없는 동작

  4. 4

    Xcode10 유효성 검사 : 이미지에 투명성이 없지만 여전히 수락되지 않습니까?

  5. 5

    java.lang.UnsatisfiedLinkError : 지정된 모듈을 찾을 수 없습니다

  6. 6

    rclone으로 원격 디렉토리의 모든 파일을 삭제하는 방법은 무엇입니까?

  7. 7

    상황에 맞는 메뉴 색상

  8. 8

    SMTPException : 전송 연결에서 데이터를 읽을 수 없음 : net_io_connectionclosed

  9. 9

    정점 셰이더에서 카메라에서 개체까지의 XY 거리

  10. 10

    Windows cmd를 통해 Anaconda 환경에서 Python 스크립트 실행

  11. 11

    다음 컨트롤이 추가되었지만 사용할 수 없습니다.

  12. 12

    C #에서 'System.DBNull'형식의 개체를 'System.String'형식으로 캐스팅 할 수 없습니다.

  13. 13

    JNDI를 사용하여 Spring Boot에서 다중 데이터 소스 구성

  14. 14

    Cassandra에서 버전이 지정된 계층의 효율적인 모델링

  15. 15

    복사 / 붙여 넣기 비활성화

  16. 16

    Android Kotlin은 다른 활동에서 함수를 호출합니다.

  17. 17

    Google Play Console에서 '예기치 않은 오류가 발생했습니다. 나중에 다시 시도해주세요. (7100000)'오류를 수정하는 방법은 무엇입니까?

  18. 18

    SQL Server-현명한 데이터 문제 받기

  19. 19

    Seaborn에서 축 제목 숨기기

  20. 20

    ArrayBufferLike의 typescript 정의의 깊은 의미

  21. 21

    Kubernetes Horizontal Pod Autoscaler (HPA) 테스트

뜨겁다태그

보관