Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios swift-通过Segue返回并传递多个数组和一个Int_Ios_Swift_Swift4 - Fatal编程技术网

Ios swift-通过Segue返回并传递多个数组和一个Int

Ios swift-通过Segue返回并传递多个数组和一个Int,ios,swift,swift4,Ios,Swift,Swift4,我正在写一个小的基本程序(仍在学习),但我遇到了一个障碍 我现在可以在两个视图控制器之间传递一个数组,并在第二个视图控制器中按下按钮时成功打印它 然而,我真正想做的是传递2个数组和一个整数,它们是从第一个VC上的函数创建的,并通过第二个VC访问它们 第一个VC的代码如下: override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "goToWorkout" {

我正在写一个小的基本程序(仍在学习),但我遇到了一个障碍

我现在可以在两个视图控制器之间传递一个数组,并在第二个视图控制器中按下按钮时成功打印它

然而,我真正想做的是传递2个数组和一个整数,它们是从第一个VC上的函数创建的,并通过第二个VC访问它们

第一个VC的代码如下:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            destVC.bothArrays = self.testFunction()
        }
    }
    //Get the new view controller using segue.destinationViewController.
    //Pass the selected object to the new view controller.
}

func testFunction() -> [String] {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return BOTH ARRAYS AND INT TO SEND TO THE NEXT VIEW CONTROLLER?
}

@IBAction func goPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "goToNextVC", sender: self)
}
第二个VC在这里:

class WorkoutViewController: UIViewController {

    var randomArray1 = [String]()
    var randomArray2 = [String]()
    var randomInt = 0

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func nowButtonPressed(_ sender: UIButton) {
        print(randomArray1)
        print(randomArray2)
        print(randomInt)
    }
}
我可以让它只使用一个数组,但我需要多个数组和一个要传递的值!我尝试过使用它(例如,尝试'->[String],[String],Int),但没有成功


非常感谢任何帮助

您可以简单地使用
元组
在单个变量中包含多个不同类型的变量。您应该将包含
performsgue
函数中所有3个变量的元组作为
sender
参数传递,然后将它们分配给
prepare(for:)
方法中的相关实例属性

如果希望保留用于生成变量的函数,则应将函数的返回类型更改为可以容纳3个变量的元组

func testFunction() -> (arr1:[String],arr2:[String],randInt:Int) {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return (randomArray1, randomArray2, randomInt)
}
然后将
testFunction
的返回值分配给
performsgue
的发送方输入参数:

performSegue(withIdentifier: "goToNextVC", sender: testFunction())
分配变量:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController, let variablesToBePassed = sender as? (arr1:[String],arr2:[String],randInt:Int) {
            destVC.randomArray1 = variablesToBePassed.arr1
            destVC.randomArray2 = variablesToBePassed.arr2
            destVC.randomInt = variablesToBePassed.randInt
        }
    }
}

正如其他人所建议的,您可以重构函数以返回元组,然后使用该元组传递给其他视图控制器:

//This is the tuple data type we use to pass 2 string arrays and an Int
typealias  parameterTuple = ([String], [String], Int)


func testFunction() -> parameterTuple {
    let randomArray1 = ["blah","blah","ploop"]
    let randomArray2 = ["alan", "john"]
    let randomInt = 5
    return (randomArray1, randomArray2, randomInt)
}


func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "goToWorkout" {
        if let destVC = segue.destination as? WorkoutViewController {
            //refactor WorkoutViewController to have a parameters property 
            //of type parameterTuple, split out the tuple and pass each part to
            //a different property in your WorkoutViewController
            destVC.parameters = testFunction()
        }
    }
}

您应该可以将元组(array1、array2、int)不使用func赋值,而是直接在prepare(…)中为每个属性分别赋值。DestVC.randomArray1=randomArray1,依此类推on@nc14您不能在注释中放换行符,因此您的注释中缺少实际的错误消息对不起,现在应该在那里了@nc14更新了我的答案,这将修复第一个错误。对于第二个错误,正如我在回答中已经指出的,您应该声明所有3个变量,使它们可以从调用
performsgue
Yes perfect的范围访问-这修复了第一个错误,我看到您在那里做了什么。关于第二点,我尝试在performsgue上方的“goPressed”函数中调用“testFunction”,但这不起作用-如果需要使用函数生成变量,如何使用您的方法?(很抱歉,这可能真的很容易!)@nc14检查我的更新答案,我已将其修改为使用
testFunction
生成变量hanks-您能否详细说明“重构workoutviewcontroller”部分?我试着设置一个属性,比如“parameters=([String]),[String],Int()”,但是上面说“不能调用函数类型any的值”和“不能在没有参数的情况下调用”