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] 삭제
몇 마디 만하겠습니다