用于匹配String的子串的Swift switch语句

LPS*_*LPS 8 if-statement ios swift

我试图从变量中要求一些值.该变量将具有天气的描述,并且我想要询问特定的单词以显示不同的图像(如太阳,下雨等).事情是我有这样的代码:

    if self.descriptionWeather.description.rangeOfString("Clear") != nil
{
    self.imageWeather.image = self.soleadoImage
}
if self.descriptionWeather.description.rangeOfString("rain") != nil
{
    self.imageWeather.image = self.soleadoImage
}
if self.descriptionWeather.description.rangeOfString("broken clouds") != nil
{
    self.imageWeather.image = self.nubladoImage
}
Run Code Online (Sandbox Code Playgroud)

因为当我试图添加"OR"条件时,xcode给了我一些奇怪的错误.

有可能用那个做一个swich句子吗?或者任何人都知道如何为if子句添加OR条件?

Jen*_*nny 25

我今天遇到了类似的问题,并意识到自Swift 1以来这个问题还没有更新!这是我在Swift 4中解决它的方法:

switch self.descriptionWeather.description {
case let str where str.contains("Clear"):
    print("clear")
case let str where str.contains("rain"):
    print("rain")
case let str where str.contains("broken clouds"):
    print("broken clouds")
default:
    break
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案/答案比接受的答案要好得多。 (3认同)

Nat*_*ook 11

您可以使用值绑定和where子句使用switch语句执行此操作.但首先将字符串转换为小写!

var desc = "Going to be clear and bright tomorrow"

switch desc.lowercaseString as NSString {
case let x where x.rangeOfString("clear").length != 0:
    println("clear")
case let x where x.rangeOfString("cloudy").length != 0:
    println("cloudy")
default:
    println("no match")
}

// prints "clear"
Run Code Online (Sandbox Code Playgroud)


Ale*_*ica 6

如果您经常这样做,则可以实现~=定义子字符串匹配的自定义运算符。它适合这种漂亮的语法:

switch "abcdefghi".substrings {
    case "def": // calls `"def" ~= "abcdefghi".substrings`
        print("Found substring: def") 
    case "some other potential substring":
        print("Found \"some other potential substring\"")
    default: print("No substring matches found")
}
Run Code Online (Sandbox Code Playgroud)

执行:

import Foundation

public struct SubstringMatchSource {
    private let wrapped: String
    
    public init(wrapping wrapped: String) {
        self.wrapped = wrapped
    }
    
    public func contains(_ substring: String) -> Bool {
        return self.wrapped.contains(substring)
    }
    
    public static func ~= (substring: String, source: SubstringMatchSource) -> Bool {
        return source.contains(substring)
    }
}

extension String {
    var substrings: SubstringMatchSource {
        return SubstringMatchSource(wrapping: self)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @LeoDabus:确实就是这样。– 这些限制已添加到 Swift 5 中的 stdlib 中。我记得前段时间在 Swift 论坛上讨论过,但找不到正确的知道。如果我没记错的话,*所有*符合 StringProtocol 的类型都应该满足该限制,并且在 stdlib 中不需要它被认为是一个遗漏(已在 Swift 5 中修复)。 (2认同)

Lal*_*hna 6

Swift 5 解决方案

func weatherImage(for identifier: String) -> UIImage? {
    switch identifier {
    case _ where identifier.contains("Clear"),
         _ where identifier.contains("rain"):
        return self.soleadoImage
    case _ where identifier.contains("broken clouds"):
        return self.nubladoImage
    default: return nil
    }
}
Run Code Online (Sandbox Code Playgroud)


das*_*ght 5

Swift 语言有两种OR运算符 - 按位运算符|(单竖线)和逻辑运算符||(双竖线)。在这种情况下,您需要一个合乎逻辑的OR

if self.descriptionWeather.description.rangeOfString("Clear") != nil || self.descriptionWeather.description.rangeOfString("clear") != nil {
    self.imageWeather.image = self.soleadoImage
}
Run Code Online (Sandbox Code Playgroud)

与 Objective-C 不同,你可以通过按位OR来换取略有不同的运行时语义,Swift 需要OR上述表达式中的逻辑。