gpt4 book ai didi

swift 问题: how can we init an non-optional variable in a if else block if it's of protocol type?

转载 作者:行者123 更新时间:2023-11-28 10:29:17 25 4
gpt4 key购买 nike

在 Swift 中,我们可以不立即初始化非可选变量,而是稍后在 if else block 中初始化,例如:

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

但是如果我的变量是协议(protocol)类型呢? (在我的示例中,我想使用作为协议(protocol)的 GraphQLMutation 来执行此操作):

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

Swift 编译器错误提示:协议(protocol)“GraphQLMutation”只能用作通用约束,因为它具有 Self 或关联类型要求

有什么想法可以做到这一点并避免代码重复吗?

最佳答案

它确实适用于协议(protocol):

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

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

它只是不适用于具有关联类型的协议(protocol)。您只能在通用函数中使用它。这是一些展示它的代码:

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 的实例作为 Actor A() as? Foo之所以有效,是因为它的类型是 Foo与关联类型 Int let a1: A? 要求.

  • a2我们得到 nil 作为 Actor B() as? Foo失败,因为它无法转换为 Foo与关联类型 Int let a2: A? 要求.

  • b1我们得到 nil 作为 Actor A() as? Foo失败,因为它无法转换为 Foo与关联类型 String let b1: B? 要求.

  • b2我们得到一个 B 的实例作为 Actor B() as? Foo之所以有效,是因为它的类型是 Foo与关联类型 String let b2: B? 要求.

关于 swift 问题: how can we init an non-optional variable in a if else block if it's of protocol type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57108831/

25 4 0
文章推荐: swift - 使用 SwiftUI 时调用 "viewDidLoad"时如何运行函数
文章推荐: javascript - 我的 CSS 或 JavaScript 都没有修改
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com