我枚举了看起来像的城市
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"
}
City
与 String
是完全不同的东西.
而且我们不能使用 City
代替 String
或相反亦然。 (就像前面的例子一样,Int
与 String
完全不同)。
因此,如果您有一个需要 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/