Swift 2:计算字符串中出现次数的函数不起作用

Swift 2: Function counting occurrence in string not working

我正在尝试学习 Swift 2 计算输入字符串中 G 和 C 的频率

我在字符串的 for 循环中没有得到任何计数。 Xcode 建议我使用 let 而不是 var 因为 gc_count 因为它没有更新(不应该是这种情况!)。

我的 return 语句也出现了这个错误:

Binary operator '/' cannot be applied to operands of type 'Double' and 'Float'

尝试过

func GC(input_seq: String) -> Float {
    let SEQ = input_seq.uppercaseString
    var gc_count = 0.0
    for nt in SEQ.characters {
        print(nt)
        if (nt == "G") {
            var gc_count = gc_count + 1
        }
        if (nt == "C") {
            var gc_count = gc_count + 1
        }
    }

    var length: Float = Float(SEQ.characters.count)

    return gc_count/length
}

let query_seq = "ATGGGGCTTTTGA"
GC(query_seq)

如果我在 Python 中这样做,我会简单地:

def GC(input_seq):
    SEQ = input_seq.upper()
    gc_count = 0.0
    for nt in SEQ:
        if (nt == "G") or (nt == "C"):
            gc_count += 1
    return gc_count/len(SEQ)

尝试替换

if (nt == "G") {
    var gc_count = gc_count + 1
}
if (nt == "C") {
    var gc_count = gc_count + 1
}

if (nt == "G") {
    gc_count = gc_count + 1
}
if (nt == "C") {
    gc_count = gc_count + 1
}

如果在 if 主体中写入 var gc_count,则会创建一个新的局部变量 gc_count,它会从外部作用域中隐藏 gc_count

此外,使用 let 作为长度,因为您不会更改它。

并且由于 gc_count 是 Double,而你的函数 returns FloatlengthFloat,你必须做一些某处的转换。或者改变一些类型。

考虑到这一点并进行了一些改进,我得到了这个:

func GC(input_seq: String) -> Float {
    let SEQ = input_seq.uppercaseString
    var gc_count = 0
    for nt in SEQ.characters {
        print(nt)
        if nt == "G" || nt == "C" {
            gc_count = gc_count + 1
        }
    }

    let length = Float(SEQ.characters.count)

    return Float(gc_count) / length
}