gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:54:53 25 4
gpt4 key购买 nike

大约一周前,我问了这个问题的一部分,但被否决了,所以我花了时间来解决它。我已经弄清楚如何完成在 UIPicker 和函数之间传递的第一部分。我创建了一个类calculateTime(),里面是我的函数,它接受数组作为参数。然后计算出一个数字,我将其标记为计数。接下来我需要做的是将计数传递给 update() 函数,以便我可以使用倒计时器更新我的文本标签。无论我把这个函数放在哪里,我都无法让它工作。如果它在类内部,我会收到选择器错误。如果它在类之外,我无法获取它的计数值。它被我在代码顶部设置的值覆盖。我将所有代码粘贴在这里。我希望有人能在这里帮助我,我对自己无法解决这个问题感到非常沮丧。

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 实例,并且可以从整个文件中的任何位置更新它。即在文件顶部:

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,而不是仅仅公开计数并将计数设置为私有(private)。即

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
}

这也可以让您访问该变量。另外,如果这对您没有帮助,请查看委托(delegate)和协议(protocol),您也可以通过这种方式传递变量。

关于ios - 无法将变量从类中的函数传递到 Swift 中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33758392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com