我正在关注Swift.org
的教程下面的switch语句示例引发错误。
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
我得到的错误是: error: value of type 'String' has no member 'hasSuffix'
case let x where x.hasSuffix("pepper"):
使用ubuntu 14.04
和我的Swift版本是swift --version
Swift version 3.0 (swift-3.0-PREVIEW-2)
答案 0 :(得分:19)
hasSuffix(_:)
String
成员来自NSString
(来自基金会)。在Xcode Playgrounds和项目中使用Swift时,可以从Swift标准库中获得此方法,而在从例如Swift编译Swift时可以使用在IBM沙箱/您的本地Linux机器上,无法访问Swift std-lib版本,而来自core-libs Foundation的版本是。
要访问后一种实现,您需要显式导入Foundation:
import Foundation // <---
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
print("Is it a spicy \(x)?")
default:
print("Everything tastes good in soup.")
}
大多数Swift教程都会假设通过Xcode执行,import Foundation
可以是任何&#34; ...没有成员的第一次尝试补救措施......&#34; 在Xcode之外编译Swift时出错。
正如@Hamish在下面的评论中指出的那样(谢谢!),标准库中提供了hasSuffix(_:)
的一个实现,但需要_runtime(_ObjC)
。
来自swift/stdlib/public/core/StringLegacy.swift:
#if _runtime(_ObjC) // ... public func hasSuffix(_ suffix: String) -> Bool { // ... } #else // FIXME: Implement hasPrefix and hasSuffix without objc // rdar://problem/18878343 #endif
如果上面的一个不可访问(例如来自Linux),则可以使用另一种实现。但是,访问此方法需要隐式import Foundation
语句。
来自swift-corelibs-foundation/Foundation/NSString.swift:
#if !(os(OSX) || os(iOS)) extension String { // ... public func hasSuffix(_ suffix: String) -> Bool { // ... core foundation implementation } } #endif