我试图从变量中请求一些值。 该变量将具有天气的描述,我想要询问特定的单词以显示不同的图像(如太阳,下雨等) 问题是我有这样的代码:
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给了我一些奇怪的错误。
有可能用那个做一个swich句子吗?或者任何人都知道如何为if子句添加OR条件?
答案 0 :(得分:18)
我今天遇到了类似的问题,并意识到自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
}
答案 1 :(得分:9)
您可以使用值绑定和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"
答案 2 :(得分:4)
Swift语言有两种OR
运算符 - 按位运算符|
(单一垂直线)和逻辑运算符||
(双垂直线)。在这种情况下,您需要一个逻辑OR
:
if self.descriptionWeather.description.rangeOfString("Clear") != nil || self.descriptionWeather.description.rangeOfString("clear") != nil {
self.imageWeather.image = self.soleadoImage
}
与Objective-C不同,你可以通过按位OR
来获得稍微不同的运行时语义,Swift在上面的表达式中需要一个逻辑OR
。
答案 3 :(得分:2)
如果您经常这样做,则可以实现自定义~=
运算符,该运算符定义子字符串匹配:
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")
}
答案 4 :(得分:0)
这个link还描述了重载operator~ =,它实际上被switch语句用于匹配case以允许你匹配正则表达式。
答案 5 :(得分: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
}
词典为您提供了灵活性,添加新映射很容易。
答案 6 :(得分:0)
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
}
}