错误:类型'String'的值在Swift开关

时间:2016-11-06 15:40:26

标签: switch-statement swift3

我正在关注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)

1 个答案:

答案 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