假设你有代码
if stringValue == "ab" || stringValue == "bc" || stringValue == "cd" {
// do something
}
有没有办法缩短这种情况或美化它(最好不使用switch语句)?我知道这段代码不起作用:
if stringValue == ("ab" || "bc" || "cd") {
// do something
}
我在其他语言上看到了一些复杂的解决方案,但它们似乎特定于语言,不适用于Swift。任何解决方案都将不胜感激。
答案 0 :(得分:25)
let valuesArray = ["ab","bc","cd"]
valuesArray.contains(str) // -> Bool
答案 1 :(得分:6)
不是我知道,你可以做这样的事情,
CommandBarButtons,
答案 2 :(得分:6)
您可以创建如下的扩展程序:
extension Equatable {
func oneOf(other: Self...) -> Bool {
return other.contains(self)
}
}
并像这样使用它:
if stringValue.oneOf("ab", "bc", "cd") { ... }
对于保存我输入的impl的信用:https://gist.github.com/daehn/73b6a08b062c81d8c74467c131f78b55/
答案 3 :(得分:0)
if someArray.contains(object) {
// contains
} else {
// does not contains
}
上面的函数返回bool值,然后相应地写入逻辑。
答案 4 :(得分:0)
如果您想测试String
是否包含多个值,您可以设置extension
,如:
extension String: {
func containsStrings(other: [String]) -> Bool {
for string in other {
if self.containsString(string) {
return true
}
}
return false
}
}
使用它:
let stringValue = "apple"
if stringValue.containsStrings(["ab", "bc", "le"]) {
//Do something
}
答案 5 :(得分:0)
使用switch语句。
$('#logoCarousel').carousel({
interval: 10000
})
$('.carousel .carousel-item').each(function(){
var next = $(this).next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
for (var i=0;i<3;i++) {
next=next.next();
if (!next.length) {
next = $(this).siblings(':first');
}
next.children(':first-child').clone().appendTo($(this));
}
});
答案 6 :(得分:0)
结构["some", "array"].contains("value")
可以使用,但是有点烦人:
您可以改用Set(["value"]).isSubset(of: ["some", "array"])
。
使用枚举时,好处尤其明显:
enum SomeReallyReallyLongTypeName {
case one, two
}
struct Thing {
let value: SomeReallyReallyLongTypeName
}
let thing = Thing(value: .one)
if Set([thing.value]).isSubset(of: [.one, .two]){
// :)
// Left-to-right order
// You get nice type inference
}
if [SomeReallyReallyLongTypeName.one, .two].contains(thing.value) {
// :(
// Annoying to have "SomeReallyReallyLongTypeName" in the code
}
答案 7 :(得分:0)
只是为了好玩,在 String
上重载函数怎么样:
if a.isOneOf("ab", "bc", "cd") {
print("yes")
}
extension String {
@inlinable
func isOneOf(_ first: String, _ second: String) -> Bool {
self == first || self == second
}
@inlinable
func isOneOf(_ first: String, _ second: String, _ third: String) -> Bool {
self == first || isOneOf(second, third)
}
@inlinable
func isOneOf(_ first: String, _ second: String, _ third: String, _ fourth: String) -> Bool {
self == first || isOneOf(second, third, fourth)
}
}
这为您提供了全面的性能优势,因为编译器将能够随心所欲地进行内联和尾调用,但代价是必须在代码中编写尽可能多的重载,而且也不能传递数组 - 但其他答案也处理这个问题。
答案 8 :(得分:-1)
let a = 1
let b = 1
let c = 1
let d = 1
if a == b,a==c,a==d {
print("all of them are equal")
}
else {
print("not equal")
}