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