struct传递时不保持元组顺序(swift3)

时间:2017-09-08 20:19:48

标签: ios struct swift3 uiviewcontroller tuples

我的代码生成一个显示在视图控制器1上的标签上的元组。我尝试将标签从vc1结构化为vc2但是没有保留顺序。我想做的就是在VC 2上复制vc 1上显示的确切顺序和元组的方式。

查看控制器1

 import UIKit

var number = [Int]()
var yourArray = [String]()


class ViewController: UIViewController {

    @IBOutlet var labez: UILabel!
    @IBOutlet var textA: UITextField!
    @IBOutlet var textB: UITextField!

    @IBAction func move(_ sender: Any) {



        bad.mm = [String( labez.text ?? "")]


    }
    @IBAction func store(_ sender: Any) {

        yourArray.append((textA.text!))
        number.append(Int(textB.text!)!)
        let tuples = zip(yourArray,number)
        let sorted = tuples.sorted(by: { this, next in
            if this.0 < next.0 {
                return true
            } else if this.0 == next.0 {
                return this.1 < next.1
            } else {
                return false
            }
        })
        print(sorted)

        labez.text = sorted.map { " \($0)" }.joined(separator:"\n")
     bad.mm = [String(describing:  sorted.map { " \($0)" }.joined(separator:"\n")





            )]
    }
    struct bad {

static var mm = [String]()

      }
    }

enter image description here

查看控制器2

    import UIKit

class ViewController2: UIViewController {

@IBOutlet var benCarson: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()

    benCarson.text = (String(describing: ViewController.bad.mm))
}





}

enter image description here

2 个答案:

答案 0 :(得分:0)

为什么不使用prepare(for segue:而不是结构来传递元组。

你可以这样做: 在ViewController中:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // give your segue an id (in the interface builder)
    if segue.identifier == "mySegue" , 
       let nextScene = segue.destination as? ViewController2 {
       nextScene.yourTuples = yourArray // or anything else
    } 

}

在ViewController2中:

class ViewController2: UIViewController {

val yourTuples: [String]()!

@IBOutlet var benCarson: UILabel!
override func viewDidLoad() {
    super.viewDidLoad()

    benCarson.text = (String(describing: ViewController.bad.mm))
}

}

答案 1 :(得分:0)

除了我对你如何设计数据和命名约定的批评。我相信你想要的是 ASSIGN 你的bad.mm而不是 APPEND

当您第一次向bad.mm输入值(a, 2)时,会发生什么。然后当追加时,将已排序的数组(a, 1), (a, 2)添加到现有字符串中,使其成为(a, 2), (a, 1), (a, 2)如果您指定它,它现在将只是新的排序数组{ {1}}。

分配更改

(a, 1), (a, 2)

bad.mm.append(String(describing: sorted.map { " \($0)" }.joined(separator:"\n")) 课程中

ViewController

bad.mm = String(describing: sorted.map { " \($0)" }.joined(separator:"\n") ViewController您的move函数执行类似的操作APPENDSbad.mm您可能想要分配的内容。但是,您为其指定了UITextField.Text属性,该属性是可选的。使用??运算符,您可以在提供默认值的同时解包此可选项。空字符串通常是一个很好的默认值。因此,我建议将@IBAction func move内的行更改为以下内容:

bad.mm = labez.text ?? ""

或者只是实际删除此行,因为您在早期函数中同时分配了bad.mm和labez.text。但这就是为什么你在文本周围得到optional()

这应该会给你你想要的效果。你的“元组”没有以正确的顺序传递的原因是你没有从一个VC到另一个VC抓取已排序的元组,你正在从一个VC到另一个VC抓取一个格式不正确的字符串。考虑直接传递已排序的元组,然后在ViewControllers中单独格式化字符串以减少混淆。