为什么这个快速功能不起作用?

时间:2015-06-17 19:16:26

标签: string function swift

此函数接受两个字符串参数。它应该以破折号返回第一个,除非该字符在第二个参数内的某处。例如:

dashes_except("hello", except: "lo") -> --llo

当except参数只有一个字母但在长度超过1时失败,该函数正常工作。它只是返回破折号。我对Swift很陌生,所以一些帮助会非常受欢迎!

以下是代码:

func dashes_except(word: String,except: String) -> String { 

    var loc = [String]()
    for (index, character) in enumerate(word) {
        loc.append(String(character))
    }
    var loc_except = [String]()
    for (index, character) in enumerate(except) {     
        loc_except.append(String(character))
    }
    for x in 0..<loc.count {
        for y in 0..<loc_except.count {
            if loc[x] != loc_except[y] {
                loc[x] = "-"
            }  
        }   
    }
    return "".join(loc)
}

1 个答案:

答案 0 :(得分:4)

在内循环中

    for y in 0..<loc_except.count {
        if loc[x] != loc_except[y] {
            loc[x] = "-"
        }
    }

loc[x]被短划线取代&#34; - &#34;如果它与任何不同 loc_except中的字符。如果是这样的话总会如此 异常字符串至少有两个不同的字符。

您可以使用contains()

解决此问题
for x in 0..<loc.count {
    if !contains(loc_except, loc[x]) {
        loc[x] = "-"
    }
}

话虽如此,你的功能可以简洁地写成

func dashes_except(word: String,except: String) -> String {

    return String(Array(word).map( { contains(except, $0) ? $0 : "-" } ))
}

在这里,

  • Array(word)创建一个包含所有字符的数组 字符串(你用enumerate()循环做了什么),
  • map { }替换未包含的所有字符 短划线的例外字符串和
  • String( ... )再次将字符数组转换为字符串 (你对"".join()做了什么)。