Ios 用于匹配字符串子字符串的Swift switch语句

Ios 用于匹配字符串子字符串的Swift switch语句,ios,if-statement,swift,Ios,If Statement,Swift,我试图从一个变量中获取一些值。 变量将有天气的描述,我想问一些特定的词,以显示不同的图像(如太阳、雨等) 问题是我有这样的代码: if self.descriptionWeather.description.rangeOfString("Clear") != nil { self.imageWeather.image = self.soleadoImage } if self.descriptionWeather.description.rangeOfString("rain")

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

    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
}
因为当我试图添加“或”条件时,xcode给了我一些奇怪的错误


有没有可能用这个做一个swich句子?或者任何人都知道如何向if子句中添加Or条件?

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

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

与Objective-C不同,在Objective-C中,您可以使用位
来换取稍有不同的运行时语义,Swift需要在上面的表达式中使用逻辑

您可以通过使用值绑定的switch语句和
where
子句来实现这一点。但是先把字符串转换成小写

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"

这还描述了重载运算符~=的情况,switch语句实际上使用它来匹配大小写,以允许您匹配正则表达式。

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

如果经常这样做,可以实现自定义的
~=
运算符,该运算符定义子字符串匹配:

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

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

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

func图像(对于weatherString:String)->UIImage?{
设imageMapping=[
“清晰”:自我形象,
“雨”:自我形象,
“碎云”:self.nubladoImage]
返回imageMapping.first{weatherString.contains($0.key)}值
}
字典为您提供了灵活性,添加新映射很容易。

Swift 5解决方案
您是如何添加“或”条件的?您遇到了什么奇怪的错误?例如,如果我想将第一个和第二个条件放在同一个if语句中:if self.descriptionWeather.description.rangeOfString(“清除”)!=零自我描述天气描述范围(“碎云”)!=nil{self.imageWeather.image=self.soleadoImage},错误为:非关联运算符与具有相同优先级的运算符相邻,无法调用“!=”对于类型为“($T17,NilLiteralConvertible)”的参数列表,这是一个很酷的故事,但link的deadI也在考虑类似的事情:)将字符串包装成自定义类型是个好主意。也许定义StringProtocol而不是String?@MartinR我试过了,但我认为在StringProtocol上不能使用contains,并且我遇到了一些其他泛型错误。你能试一试吗?。。。它在Swift 5中编译,但在Swift 4中不编译。@MartinR如果将结构泛型类型索引约束为String.Index
public struct SubstringMatchSource,其中S.Index==String.Index{
扩展StringProtocol,其中Index==String.Index{
它是用Swift编译的4@LeoDabus:确实如此。-这些限制已添加到Swift 5中的stdlib中。我记得不久前在Swift论坛上讨论过,但找不到正确答案。如果我没有记错,所有符合StringProtocol的类型都应该满足该限制,而不是在stdlib被认为是一个遗漏(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
    }
}