繁体   English   中英

无法将变量从类中的函数传递给Swift中的另一个函数

[英]cannot pass a variable from a function in a class to another function in Swift

大约一周前,我问了部分问题,但被否决了,所以我花了一些时间解决它。 我已经解决了如何在UIPicker和函数之间传递的第一部分。 我创建了一个类calculateTime(),并且内部是我的函数,该函数接受数组作为参数。 然后,计算出一个我标记为数字的数字。 接下来,我需要将传递计数传递给update()函数,以便可以使用倒数计时器更新文本标签。 无论我将该功能放在何处,都无法正常使用。 如果在类中,则会出现选择器错误。 如果它不在类中,我将无法获得count的价值。 它被我在代码顶部设置的值覆盖。 我在这里粘贴所有代码。 我希望有人可以在这里为我提供帮助,我对自己无法解决这个问题感到非常沮丧。

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, UIPickerViewDelegate,     UIPickerViewDataSource, UITextFieldDelegate {

@IBOutlet weak var dep: UITextField!

@IBOutlet weak var picker: UIPickerView!

@IBOutlet weak var arrivesAt: UIButton!

@IBOutlet weak var departsFrom: UIButton!

@IBOutlet weak var arr: UITextField!

@IBOutlet weak var countDownLabel: UILabel!



var pickerData: [[String]] = [[String]]()

var timer: NSTimer!

var count = 2

var arrayTimes = [""]


override func viewDidLoad() {
    super.viewDidLoad()


    calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])

    picker.hidden = true

    dep.delegate = self

    dep.resignFirstResponder()
    arr.resignFirstResponder()

    //Picker

    // Connect data:
    self.picker.delegate = self
    self.picker.dataSource = self


    // Input data into the Array:
    pickerData = [["larkspur", "saulsalito", "san francisco", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."],
        ["san francisco", "saulsalito", "larkspur", "fisherman's wharf", "giants stadium", "tiburon", "vallejo", "alameda", "harbor bay", "jack london", "south s.f."]]

}



//Mark - Location Delegate Methods



struct MyViewState {
    static var count = 8
}



class calculateTime {

    var timesArray:[String] = []

    var timer: NSTimer!

    var count: Int = 0

    func refreshView(array: [String]) {


        let date = NSDate()
        let calendar = NSCalendar.currentCalendar()
        let components = calendar.components([.Hour, .Minute], fromDate: date)
        let hour = components.hour
        let minutes = components.minute
        let currentTime = "\(hour)" + ":" + "\(minutes)"

        self.timesArray = array

        print(timesArray)

        // create a method to convert your time to minutes
        func stringToMinutes(input:String) -> Int {
            let components = input.componentsSeparatedByString(":")
            let hour = Int((components.first ?? "0")) ?? 0
            let minute = Int((components.last ?? "0")) ?? 0
            return hour*60 + minute
        }

        //create an array with the minutes from the original array
        let timesMinutesArray:[Int] = timesArray.map { stringToMinutes($0) }

        let dayMinute = stringToMinutes(currentTime)
        // filter out the times that has already passed
        let filteredTimesArray = timesMinutesArray.filter{$0 > dayMinute }

        // get the first time in your array
        if let firstTime = filteredTimesArray.first {
            // find its position and extract it from the original array
            let nextDeparture = timesArray[timesMinutesArray.indexOf(firstTime)!]   //  "15:40"


            let userCalendar = NSCalendar.currentCalendar()


            let dateMakerFormatter = NSDateFormatter()
            dateMakerFormatter.calendar = userCalendar
            dateMakerFormatter.dateFormat = "yyyy/MM/dd"



            // How many hours and minutes between now and the next ferry

            dateMakerFormatter.dateFormat = "H:mm"
            let startTime = dateMakerFormatter.dateFromString(currentTime)!
            let endTime = dateMakerFormatter.dateFromString(nextDeparture)!
            let hourMinuteComponents: NSCalendarUnit = [.Hour, .Minute]
            let timeDifference = userCalendar.components(
                hourMinuteComponents,
                fromDate: startTime,
                toDate: endTime,
                options: [])

            let difference = (timeDifference.hour*60) + (timeDifference.minute)

            var count = difference

            print(count)  //this returns correctly


           timer = NSTimer.scheduledTimerWithTimeInterval(1, target: ViewController(), selector: "update", userInfo: nil, repeats: true)




        }


    }

}


//Picker

// The number of columns of data
func numberOfComponentsInPickerView(picker: UIPickerView) -> Int {
    return 2
}

// The number of rows of data
func pickerView(picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return pickerData[component].count
}

// The data to return for the row and component (column) that's being passed in
func pickerView(picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return pickerData[component][row]
}


//Show picker wen text field is click in
func textFieldShouldBeginEditing(textfield: UITextField) -> Bool {
    dep.resignFirstResponder()
    arr.resignFirstResponder()
    self.dep.tintColor = UIColor.clearColor()
    self.arr.tintColor = UIColor.clearColor()

    picker.hidden = false

    return false

}

//Make text uneditable
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return false
}


// Catpure the picker view selection
func pickerView(picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    // This method is triggered whenever the user makes a change to the picker selection.
    // The parameter named row and component represents what was selected.
    print("/[component][row]")

    let fromto = pickerData[component][row]


    print(fromto)

    if component == 0 {

        var count = calculateTime().count

        arr.text = "san francisco"

        dep.text = pickerData[component][row]

        calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])

        print("help")

       self.countDownLabel.text = "\(count)"

        print(count)

    }

    else {

        dep.text = pickerData[component][row]
    }



    picker.hidden = true;
}


func pickerView(picker: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView
{
    var pickerLabel = UILabel()
    pickerLabel.textColor = UIColor( red: CGFloat(41/255.0), green: CGFloat(100/255.0), blue: CGFloat(226/255.0), alpha: CGFloat(1.0) )
    pickerLabel.text = pickerData[component][row]
    // pickerLabel.font = UIFont(name: pickerLabel.font.fontName, size: 15)
    pickerLabel.font = UIFont(name: "Helvetica Neue", size: 20) // In this use your custom font
    pickerLabel.textAlignment = NSTextAlignment.Center
    return pickerLabel
}
func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
    return 36.0
}



func update() {


    if count == 1{
        //self.minutes.text = "minute"
        print("did change")
    }

    if(count > 0)
    {
        //countDownLabel.text = String(count--)

        print(count)
    }

    else if (count == 0)
    {
        timer.invalidate()
        print("ended")
        calculateTime().refreshView(["5:45", "6:35", "7:00", "7:30", "7:50", "8:20", "8:40", "9:15", "10:10", "11:10", "12:40", "14:15", "14:50", "15:40", "16:10", "17:10", "17:40", "18:40", "19:25", "20:50"])

    }



}

}

您应该在文件的最顶部添加count变量,以便所有功能都可以在文件内访问它。 这样,您将只有一个count实例,并且可以从整个文件中的任何位置更新它。 即在文件的顶部:

var count : Int = calculateTime().count

然后,您可以像在

update()

功能。

如果它们在不同的类中,则需要创建该类的实例,或者已经传递了该类的实例。例如,如果count是在类A中初始化的:

public class A {
    var count : Int = 0
}

如果要访问类B中的变量,可以执行以下操作:

public class B {
    var classA : A = A()

    print("Count : \(classA.count)")
}

这将使您可以访问创建的A实例的计数。 另外,创建类B的实例时,可以在初始化时传递类A的适当实例。 例如

public class C {
    var a : A = A()
    var b : B = B(class : a)
}

public class B {
    var count : Int

    init(class : A = A()) {
        count = class.count
    }
}

另外,请记住,在OOP中,您可能希望使用getter和setter,而不只是公开计数并将其私有化。

public class A {
    private var _count = 0

    var count : Int {
        get {
            return _count
        }

        set {
            if newValue != _count {
                _count = newValue
            }
        }
    }
}

public class B {
    var classA : A = A()

    classA.count = 2 // Would set the count of class A, for the particular instance you have created as 2
}

这也将使您能够访问变量。 另外,如果这对您没有帮助,请查看委托和协议,您也可以通过这种方式传递变量。

暂无
暂无

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

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