2014-11-18 4 views
1

보기 컨트롤러간에 전체 배열을 전달하려고하지만 누락 된 부분을 알아낼 수 없습니다. 뷰 컨트롤러 하나에빠른보기 컨트롤러간에 전체 배열 전달

나는이 :보기 컨트롤러 두에서

protocol ExclusionsViewViewControllerDelegate{ 
    func ExcUpperDidFinish(controller:ExclusionsView) 
    func ExcLowerDidFinish(controller:ExclusionsView) 

} 

class ExclusionsView: UIViewController, UITableViewDataSource, UITableViewDelegate { 
    var delegate:ExclusionsViewViewControllerDelegate? = nil 
    var ExcLowerArray:[Int]=[] 
    var ExcUpperArray:[Int]=[] 

    @IBOutlet var ExcLowerText: UITextField! 
    @IBOutlet var ExcUpperText: UITextField! 
    @IBOutlet var ExcFreqTable: UITableView! 

    @IBAction func BackButton(sender: AnyObject) { 
     if (delegate != nil){ 
      delegate!.ExcUpperDidFinish(self, Array: ExcUpperArray) 
      delegate!.ExcLowerDidFinish(self, Array: ExcLowerArray) 
     } 
     dismissViewControllerAnimated(true,completion:nil) 
    } 

나는이 :

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,   PreferencesViewControllerDelegate, ExclusionsViewViewControllerDelegate { 

var ExcUpperFreqArray:[Int]=[] 
var ExcLowerFreqArray:[Int]=[] 

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

func ExcLowerDidFinish(controller: ExclusionsView, Array:[Int]) { 
    ExcLowerFreqArray = Array 
    controller.navigationController?.popViewControllerAnimated(true) 
} 
func ExcUpperDidFinish(controller: ExclusionsView, Array:[Int]) { 
    ExcUpperFreqArray = Array 
    controller.navigationController?.popViewControllerAnimated(true) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { 
if segue.identifier == "pushExclusions"{ 
     let zc = segue.destinationViewController as ExclusionsView 
     zc.ExcLowerArray = ExcLowerFreqArray 
     zc.ExcUpperArray = ExcUpperFreqArray 
    } 
} 

내가 제대로 배열을 참조하는 방법을 알아낼 수 없습니다. 보기 컨트롤러 1에서 배열 ExcLowerArray를 만들려고합니다.보기를 변경하면 두 번째보기 컨트롤러에서 모든 데이터를 ExcLowerFreqArray에 복사하므로 해당보기 컨트롤러에서 참조 할 수 있습니다. 순간 나는이 두 줄에 오류가 얻을하지만! 대리자를 .ExcLowerDidFinish (자기, 배열 : ExcLowerArray) FUNC의 ExcLowerDidFinish을 (컨트롤러 : ExclusionsView, 배열 : [지능]) {

+0

문제에 대해 조금 더 자세히 설명해 주시겠습니까? 배열 참조가 전달되기를 원하지만 복사본이 대신 생성됩니까? – Antonio

답변

2

스위프트 배열은 값 유형, 그리고 그것들은 참조가 아닌 값에 의해 전달됩니다. 즉, 배열이 함수에 전달되고, 변수에 할당 될 때 복사본이 만들어 짐을 의미합니다.

배열을 전달하려면 값 유형)을 참조로 함수에 연결하려면 함수 선언에 inout 수정자를 사용하고 인수를 함수에 전달할 때 참조 연산자 &을 사용할 수 있습니다.

func ExcLowerDidFinish(controller: String, inout Array:[Int]) 

과 : 귀하의 경우에는

delegate!.ExcLowerDidFinish(self, Array: &ExcUpperArray) 

주제 끄기 : 빠른 기능/메소드와 변수의 관례/매개 변수 이름은 반면 유형 (클래스, 구조체, 등, 소문자로 시작 있습니다) 대문자로 시작하십시오. 귀하의 코드는 다른 Swift 개발자들에게는 읽기 어려울 수 있습니다.

+0

답변 해 주셔서 감사 드리며 컨벤션 노트를 보내 주셔서 감사합니다. 코딩에 익숙하지 않다는 것을 알 수 있습니다.이 코드에서 오류가 수정되었습니다. 뷰 컨트롤러 2에서 일부 값을 만들고 컨트롤러 1보기로 이동하면 모든 값이 내 배열에 복사됩니다. 그러나 뷰 컨트롤러 하나에 값을 추가 한 다음 두 개로 이동하면 값 중 하나도 다른 배열에 복사되지 않습니다. 그래서 두 개의 배열에 관한 나의 segue가 작동하고 있습니다. 그러나 기능이 제대로 작동하지 않습니다. 이 코드와 관련된 문제를 볼 수 있습니까? 아니면 두보기 컨트롤러 모두에서 prepareForSegue 메서드를 만드는 것이 가장 좋을까요? – samp17

+0

'ExcLowerDidFinish'와'ExcUpperDidFinish'에서 전달 된 배열이 로컬 속성에 * 복사 * 된 것을 봅니다. 그게 문제 일 수 있습니다. 이 경우 2 개의 배열을 포함하는 클래스를 만들고 2 개의 배열 속성을 해당 클래스의 인스턴스로 대체 한 다음 클래스 참조 유형 인 함수에 전달하면 참조로 전달됩니다. 문제를 해결할 수있는 우아한 방법이 아닐 수도 있습니다. – Antonio

관련 문제