swift - 对 Swift 中枚举的误解

标签 swift string enums

我枚举了看起来像的城市

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/

相关文章:

swift - 如何在 Swift 中使用 deltaTime 正确计算 1 秒

ios - 在不中断背景媒体播放的情况下录制音频

php - 如何从字符串中提取标签

java - 从一个大字符串中一次读取一个字符

c++ - "Symbol uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS could not be resolved"

ios - 自定义 UINavigationBar 的外观

ios - 标签的 UITest 颜色(不是 UI 标签)

java - 如何将 'Scanner' 与 'LenthOfString' 匹配在一起工作?

java - 我可以使用 Spring 注入(inject)来注入(inject)枚举吗?

ruby-on-rails-4 - 枚举选项 "new"不起作用