用于匹配字符串子串的 Switch 语句

问题描述 投票:0回答:7

我试图从变量中获取一些值。 该变量将包含天气的描述,我想询问特定的单词以显示不同的图像(如阳光、雨等)。
我有这样的代码:

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
}

当我尝试添加“OR”条件时,Xcode 给出了一些奇怪的错误。

可以用它来做一个

switch
句子吗?或者有人知道如何在
if
子句中添加 OR 条件吗?

ios swift if-statement switch-statement
7个回答
102
投票

我今天遇到了类似的问题,并意识到这个问题自 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
}

25
投票

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
    }
}

13
投票

您可以使用值绑定和

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"

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")
}

实施:

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)
    }
}

5
投票

Swift 语言有两种

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

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

与 Objective-C 不同,在 Objective-C 中,您可以使用按位

OR
来换取稍微不同的运行时语义,Swift 在上面的表达式中需要一个逻辑
OR


0
投票

我建议使用字典,作为您正在搜索的子字符串和相应图像之间的映射:

func image(for weatherString: String) -> UIImage? {
    let imageMapping = [
        "Clear": self.soleadoImage,
        "rain": self.soleadoImage,
        "broken clouds": self.nubladoImage]
    return imageMapping.first { weatherString.contains($0.key) }?.value
}

字典为您提供了灵活性,添加新映射很容易。


-1
投票

这个链接还描述了重载运算符 ~=,它实际上由 switch 语句用于匹配案例,以允许您匹配正则表达式。

© www.soinside.com 2019 - 2024. All rights reserved.