繁体   English   中英

Swift数组(字符串)不起作用

[英]Swift Array(string) not working

我正在尝试制作一个刽子手游戏。 我要粘贴我的代码因为我觉得我的问题在这里,我只是没有看到。 向下看,找到我写的部分这就是错误发生的地方。 这是我得到的错误消息:在调用中缺少参数标签'arrayLiteral'。 当我添加arrayLiteral时,代码不起作用。 我对Swift很新,所以非常感谢一些帮助! 谢谢! (对不起,有很多代码可能与问题无关)

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {

    @IBOutlet weak var secret_word_label: UILabel!
    @IBOutlet weak var guess_field: UITextField!
    @IBOutlet weak var submit_button: UIButton!

    //only for bug testing
    @IBOutlet weak var arb_print: UILabel!
    @IBOutlet weak var print_secret: UILabel!

    var user_guesses = [String]()

    var secret_word = "asdf"

    var wrong_guesses = 0

    var guess_letter = ""

    var correct_guesses = 0

    let limit_wrongs = 3

    var secret_word_loc = [String]()


    func return_len(text: String) -> Int {

        var final = [String]()

        var loc = Array(text)

        for letter in loc {

            if !contains(final, String(letter)) {

                final.append(String(letter))

                }

        }

        return final.count

    }


    func gen_secret_word() -> String {

        var random_num = arc4random_uniform(4)

        var words = ["hello","world","iphone","apple"]

        return words[Int(random_num)]

    }


    func start_game(action: UIAlertAction! = nil) {

        secret_word = gen_secret_word()

        print_secret.text = secret_word

        secret_word_label.text = dashes_except(secret_word,except: "1")


       THIS IS WHERE THE ERROR OCCURS <


        secret_word_loc = Array(secret_word)


        >
        user_guesses = [String]()

        correct_guesses = 0

        wrong_guesses = 0



    }


    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 {

            if !contains(loc_except, loc[x]) {

                loc[x] = "-"

            }

        }

        return "".join(loc)

    }


    func textFieldShouldReturn(textField: UITextField!) -> Bool {

        textField.resignFirstResponder()

        return true

    }


    @IBAction func submit_engaged(sender: UIButton) {

        guess_letter = guess_field.text

        if contains(user_guesses, guess_letter) {

            var nuttin = "well nuttin"

        }

        else if contains(secret_word_loc, guess_letter) {

            correct_guesses += 1

            user_guesses.append(guess_letter)

        } else {

            wrong_guesses += 1

            user_guesses.append(guess_letter)

        }



        arb_print.text = "".join(user_guesses)

        secret_word_label.text = dashes_except(secret_word,except: "".join(user_guesses))

        if correct_guesses == return_len(secret_word) {

            //give alert that they won and then ask for continue to play again and put how many guesses it took them


            let ac = UIAlertController(title: "You won", message: "Congrats. It took you \(wrong_guesses + correct_guesses) tries", preferredStyle: .Alert)

            ac.addAction(UIAlertAction(title: "Play Again", style: UIAlertActionStyle.Default, handler: start_game))

            presentViewController(ac, animated: true, completion: nil)


        }

        else if wrong_guesses == limit_wrongs {

            //give alert that they lost and then ask for continue to play again and give the word

            let ac = UIAlertController(title: "You lost", message: "The word was \(secret_word)", preferredStyle: .Alert)

            ac.addAction(UIAlertAction(title: "Play Again", style: UIAlertActionStyle.Default, handler: start_game))

            presentViewController(ac, animated: true, completion: nil)

        }









    }


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        guess_field.delegate = self

        start_game()

    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

尝试secret_word_loc = [secret_word]

因为您将secret_word_loc声明为Array<String>的类型,而Array<secret_word>实际上是Array<Character>的类型。 您可以声明var secret_word_loc = [Character]()或者执行secret_word_loc = map("secret_word") {String($0)} ,它会将secret_word每个字符转换为String并将它们放入Array

这里有(至少)两种可能的解决方案,因为Array有几个初始化器。

首先,我们可以使用文字数组语法,它只是一对括在逗号分隔的数组元素周围的方括号:

secret_word_loc = [secret_word]

或者,我们可以使用更详细的初始化程序,它实际上解释了错误消息的来源:

secret_word_loc = Array(arrayLiteral: secret_word)

Array初始化程序接受以逗号分隔的数组元素列表,以使用实例化数组。

两种解决方案都非常好。

第二个解释了错误消息:

缺少参数标签'arrayLiteral'

这只是告诉你“嘿,一切都是对的,但你必须使用参数标签,在这种情况下是arrayLiteral

然而,第一个解决方案更像Swift-esque,我绝对更喜欢在我维护的任何代码中看到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM