gpt4 book ai didi

swift - 对 Swift 中枚举的误解

转载 作者:行者123 更新时间:2023-11-28 09:42:12 27 4
gpt4 key购买 nike

我枚举了看起来像的城市

enum Cities: String {
case la = "Los Angeles"
case ta = "Tel Aviv"
case ny = "New York"
}

我需要将带有城市名称的字符串传递给正在等待 NSString 的函数之一

所以这段代码不起作用,我不明白为什么

let selectedCity = Cities.ny
myFunc(city : selectedCity)

我收到错误“无法将‘Cities’类型的值转换为预期的参数类型‘String!’

Xcode 建议我使用 Cities.ny.rawValue 作为 selectedCity。

最佳答案

Swift 是强类型的

因此,当您将值传递给函数参数时,编译器会检查它的类型是否正确。

例子

让我们声明一个接收 Int 的函数作为参数

func giveMeYourAge(n: Int) {

}

现在让我们尝试调用该函数传递一些不是 Int 的东西

giveMeYourAge(n: "Hello World")

现在编译器生我们的气了☠️

error: cannot convert value of type 'String' to expected argument type 'Int' giveMeYourAge(n: "Hello World")

这是对的(当然)。事实上,它告诉我们不能通过 String。到一个需要 Int 的函数的确如此。

你的代码

当你声明你的枚举时(让我们称它为 City,正如 @Honey 所建议的那样),你创建了一个新类型 City .

enum City: String {
case la = "Los Angeles"
case ta = "Tel Aviv"
case ny = "New York"
}

CityString完全不同的东西.而且我们不能使用 City代替 String或相反亦然。 (就像前面的例子一样,IntString 完全不同)。

因此,如果您有一个需要 String 的函数作为参数

func myFunc(city : String) {
// ...
}

当然,您不会能够传递 City 类型的值

等等!多态性呢?

现在让我们看一下这段代码

class Animal { }
class Dog: Animal { }

func feed(animal: Animal) {

}

let dog = Dog()

feed(animal: dog)

为什么这段代码可以编译??? 😨

这称为多态性。当我们写

 class Dog: Animal { }

我们定义了一个比 Dog 更具体的新类型 ( Animal) .

多态性 确实允许我们传递给期望 Animal 的函数作为参数,更具体的东西(如 Dog )。

但是多态性与您的示例无关。即使语法相似。

当您使用此语法定义枚举时

enum City: String { ... }
  • 没有定义字符串的子类型。
  • 不是创建比字符串更具体的东西。
  • 没有使用多态性。

相反,您只是在创建一个新类型 City具有类型为 rawValue 的实例属性 ( String) .

关于swift - 对 Swift 中枚举的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44270217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com