参数标签与任何可用的重载都不匹配

时间:2017-10-18 13:02:43

标签: swift

我正在尝试创建一个字谜测试器,我非常确定我的代码应该有效,但我收到错误'参数标签'( _:)'不匹配任何可用的重载'我已经查看了有关同一错误的其他帖子,但我仍然不确定这意味着什么或如何修复它。

var anagram1 : String!
var anagram2 : String!
var failure : Bool = false
var counter : Int = 0
print("Please enter first word: ")
anagram1 = readLine()
print("Please enter Second word: ")
anagram2 = readLine()

if anagram1.count == anagram2.count {
for i in anagram1.characters{
if (!failure){
    failure = true
    for y in anagram2.characters {
        counter += 1
        if i == y {

            failure = false
            anagram2.remove(at: String.Index(counter)) // error here

        }
    }
}
else {
    print("these words are not anagrams") 
    break;
    }
}
if (!failure) {
    print("these words ARE anagrams")

}
}
else{
    print ("these words aren't even the same length you fucking nonce")
}

2 个答案:

答案 0 :(得分:1)

回答您的第一个问题:错误消息参数标签'(_:)'不匹配任何可用的重载表示您提供的函数参数名称或类型与Swift不知道的任何内容相匹配

编译器也试图告诉你要查看的参数。 '(_:)' 表示您正在使用未标记的参数调用函数。 (这意味着没有任何参数名称的值。一个看似这样的函数的常见示例是print("something")。在Swift文档中,这看起来像print(_:)

最后,重载是调用具有不同信息的函数的方法。再次使用print函数作为示例,您可以多种方式调用它。一些最常见的重载是:

// print something, followed by a newline character
print("something")

// print something, but stay on the same line
// (end with an empty string instead of the default newline character)
print("something", terminator: "") 

记录在案,可能看起来像print(_:)print(_:, terminator:) 注意:这些是细分的解释。实际的Swift文档显示了func print(_: Any..., separator: String, terminator: String),它涵盖了许多不同的重载!

查看发生错误的行,您会看到一个函数调用和一个初始化器(实际上是一个函数)。记录了您输入参数的方式,功能如下:remove(at:)String.Index(_:)

String.Index(_:)会匹配错误消息的参数,以便您的错误在哪里。 String.Index初始化程序没有带有未命名参数的重载。

要修复此错误,您需要找到为remove(at:)函数创建String.Index参数的正确方法。一种方法可能是尝试这样的事情:

for y in anagram2.characters.enumerated() {
    // `y` now represents a `tuple`: (offset: Int, element: Character)
    // so, you don't need `counter` anymore; use `offset` instead
    if i == y.element { //`i` is a Character, so it can compare to `element`
        ...
        let yIndex: String.Index = anagram2.index(anagram2.startIndex, offsetBy: y.offset)
        anagram2.remove(at: yIndex)
        ...
    }
}

但是,您的代码还有其他问题会导致更多错误。

首先,你要循环一个字符串(anagram2)并尝试同时更改它 - 这不是一件好事。

祝你好运解决问题!

答案 1 :(得分:0)

感谢Leo的帮助,但我找到了一种方法:)

if anagram1.count == anagram2.count {
for i in anagram1.characters{
if (!failure){
    counter = -1
    failure = true
    for y in anagram2.characters {
        counter += 1
        if i == y {

            failure = false
            if counter < anagram2.count {
            anagram2.remove(at: (anagram2.index(anagram2.startIndex, offsetBy: counter)))

                break;
            }



        }
    }
}