gpt4 book ai didi

swift - 为什么具有可选关联值的 Swift 枚举在声明时需要尾随括号?

转载 作者:行者123 更新时间:2023-11-28 13:29:47 24 4
gpt4 key购买 nike

我有一个带有计算属性的 Swift 枚举。有几种情况包括单个可选的关联值。如果我想在一个包含关联值的 case 值的变量上调用计算属性,那么我必须用尾随括号声明该变量,否则会出现编译器错误。

如果我不想调用计算属性,那么我不需要包含括号。

为什么会这样,尾随的括号如何改变属性的“类型”,以便可以在其上调用计算属性?

一个突出问题的简单示例:

import Foundation

enum Animal {
case dog
case other(String? = nil)

var isFriendly:Bool {
switch self {
case .dog: return true
default: return false
}
}
}

// This generates the error:
// Value of type '(String?) -> Animal' has no member 'isFriendly'

let exoticBird = Animal.other
print("Is exotic bird friendly: \(exoticBird.isFriendly)")

// This line, with the trailing parentheses, does not.

let exoticFish = Animal.other()
print("Is exotic fish friendly: \(exoticFish.isFriendly)")

最佳答案

它使用 Xcode 11 beta 编译并生成一个案例构造函数。 Here是 Swift 进化提案的链接。

您的exoticBird 不是Animal,而是一个案例构造函数。 Alt + Click 您的 exoticBird 变量,您将看到它的类型定义如下。

let exoticBird: (String?) -> Animal

我认为当您在枚举中省略关联类型时,它会创建一个基于关联类型的函数。

您可以将字符串传递给它,然后像这样在其上调用 isFriendly

isExoticBird(nil).isFriendly

因此,除非您想进行一些函数式编程,否则如果您想显式创建类型,您似乎不能保留关联类型。

现在,使用 case 构造函数类型进行小型函数转换。

像这样定义一个函数,

func isOtherAnimalFriendly(_ f: @escaping (String?) -> Animal) -> (String?) -> Bool {
return { animalName in
f(animalName).isFriendly
}
}

现在,使用下面的代码,

let exoticFish = Animal.other
let namedAnimal = isOtherAnimalFriendly(exoticFish)

注意 namedAnimal 的类型现在是,

let namedAnimal: (String?) -> Bool

你可以使用这个带有名称的新函数,

print("Is exotic fish friendly: \(namedAnimal(nil))")

也可以在上面使用map等高阶函数,

["Cat", "Cow", "Horse"].map(Animal.other) // array of animals with associated values

关于swift - 为什么具有可选关联值的 Swift 枚举在声明时需要尾随括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563534/

24 4 0
文章推荐: html - 不确定如何制作具有可缩放背景的自定义
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com