试图传递数组以在swift中运行

时间:2016-05-25 21:57:30

标签: ios arrays swift

我创建了以下功能来运行" iN"数组和" nS"数组10次将两个数组合并为1.我的计划是将数组推送到" callUpArrayResults"使用此行" callUpArrayResults(questionsArray)"但我收到了一个"无法转换类型' [AnyObject]'预期参数类型' [String]'"。 除了"不能分配给财产:' self'是不可变的"对于这一行" callUpArrayResults = arr"我错了吗?或者我可以直接从函数调用创建的数组结果,如果是这样我将如何进行?我是新手,但我正在努力学习任何指导意见。

func creatArray () {

var iN: [AnyObject] = [
//a
"Xxxxxxxx xxxxxxxxxx1",
"Xxxxxxxx xxxxxxxxxx2",
"Xxxxxxxx xxxxxxxxxx3",
"Xxxxxxxx xxxxxxxxxx4",
"Xxxxxxxx xxxxxxxxxx5",
"Xxxxxxxx xxxxxxxxxx6",
"Xxxxxxxx xxxxxxxxxx7",
"Xxxxxxxx xxxxxxxxxx8",
"Xxxxxxxx xxxxxxxxxx9",
"Xxxxxxxx xxxxxxxxxx10",
"Xxxxxxxx xxxxxxxxxx11",
"Xxxxxxxx xxxxxxxxxx12",
"Xxxxxxxx xxxxxxxxxx13",
"Xxxxxxxx xxxxxxxxxx14",
"Xxxxxxxx xxxxxxxxxx15",
"Xxxxxxxx xxxxxxxxxx16"]

var nS:[AnyObject] = [
"Yyyyyyyyyyyyyy yyyyyyyyy1",
"Yyyyyyyyyyyyyy yyyyyyyyy2",
"Yyyyyyyyyyyyyy yyyyyyyyy3",
"Yyyyyyyyyyyyyy yyyyyyyyy4",
"Yyyyyyyyyyyyyy yyyyyyyyy5",
"Yyyyyyyyyyyyyy yyyyyyyyy6",
"Yyyyyyyyyyyyyy yyyyyyyyy7",
"Yyyyyyyyyyyyyy yyyyyyyyy8",
"Yyyyyyyyyyyyyy yyyyyyyyy9",
"Yyyyyyyyyyyyyy yyyyyyyyy10",
"Yyyyyyyyyyyyyy yyyyyyyyy11",
"Yyyyyyyyyyyyyy yyyyyyyyy12",
"Yyyyyyyyyyyyyy yyyyyyyyy13",
"Yyyyyyyyyyyyyy yyyyyyyyy14",
"Yyyyyyyyyyyyyy yyyyyyyyy15",
"Yyyyyyyyyyyyyy yyyyyyyyy16"]

var questionsArray: [AnyObject] = [AnyObject]()

for var i = 0; i < 10; i++ {

    let arrayCount = iN.count
    let random = Int(arc4random_uniform(UInt32(arrayCount)))
    let xx = iN[random]
    let yy = nS[random]
        let QnA: [NSObject : AnyObject] = [
            "x" : xx,
            "y" : yy
        ]
        //remove from array
        iN.removeAtIndex(random)
        Ns.removeAtIndex(random)
        //add dictionary for each question into array
        questionsArray.append (QnA)

    print(questionsArray)

}
callUpArrayResults(questionsArray)
}

creatArray()

fun callUpArrayResults(arr:[String]){

 callUpArrayResults = arr

}

2 个答案:

答案 0 :(得分:3)

你的代码很乱。如果您要使用字符串数组,请不要键入[AnyObject]。让他们输入[String]。那么你就不会有铸造问题。

您的变量名称和方法名称应始终以小写字母开头。这是Swift和Objective-C的强大惯例。类名(和Swift类型名称)应以大写字母开头。

一旦函数返回,函数内定义的局部变量就不再存在。如果希望函数具有可在函数外部访问的结果,则使其返回结果,或使其作用于实例变量。

你没有做任何一件事,所以你的功能无法在你的功能之外访问。

如果您不知道如何做其中任何一件事,那么就该开始阅读了。我建议从Apple下载免费的Swift iBook并阅读它的前半部分。它会教你Swift语言。如果这是您的第一种编程语言,那么您可能需要一本教您使用Swift作为语言进行编程的书。

答案 1 :(得分:0)

每种语言都有自然的方式来编写代码。作为学习语言过程的一部分,尝试学习如何用该语言编写代码。

在此示例中,您希望将两个数组的元素组合成一个字典数组,随机选择其中10个字典。在Swift中,zip()map()prefix()涵盖除随机化之外的所有内容。你需要像数组的shuffle方法。

这是一个使Fisher-Yates(快速和统一)洗牌的人:

extension CollectionType {
    func shuffle() -> [Generator.Element] {
        var result = Array(self)

        if result.count > 1 {
            for i in 0 ..< result.count - 1 {
                let j = Int(arc4random_uniform(UInt32(result.count - i))) + i
                if i != j {
                    swap(&result[i], &result[j])
                }
            }
        }

        return result
    }
}

手持shuffle(),我可以解决问题。

let allQuestions = zip(iN, nS).map {xx, yy in ["x": xx, "y": yy]}
let shuffledQuestions = allQuestions.shuffle()
let first10ShuffledQuestions = shuffledQuestions.prefix(10)

let questionsArray: [AnyObject] = Array(first10ShuffledQuestions)

第一部分zip(iN, nS).map {xx, yy in ["x": xx, "y": yy]}使用"x"的密钥iN"y"的{​​{1}}创建一个字典数组。下一部分nS以随机顺序返回一个字典数组。最后一部分shuffle()返回包含前10个元素的混洗数组的数组切片。因为prefix(10)返回数组切片而不是数组,所以使用prefix()从数组切片创建一个数组,以便最终赋值给Array()

这一切都可以在一行中完成。

questionsArray