ios - 具有多个 NSDateFormatter 的 Swift 代码 - 优化

标签 ios swift core-data nsdateformatter

为了快速学习,我正在从事个人核心数据项目。到目前为止一切正常,但我不知道如何优化代码。优化我的意思只是视觉优化,性能是不同的故事,对我来说还为时过早。 在下面的类(class)中,我经常使用 dateFormatter,所以我尽量避免使用它。似乎我错过了编程中的一些基本知识,这对于绝对的初学者和业余爱好者来说并不奇怪。

import UIKit
import CoreData

class AddEditViewController: UIViewController {

    @IBOutlet weak var startDateTextField: UITextField!
    @IBOutlet weak var endDateTextField: UITextField!
    @IBOutlet weak var shipNameTextField: UITextField!
    @IBOutlet weak var positionOnBoardTextField: UITextField!
    @IBOutlet weak var workingDaysLabel: UILabel!

    var startDatePassedFromTable: NSDate!
    var endDatePassedFromTable: NSDate!
    var shipNamePassedFromTable: String!
    var positionOnBoardPassedFromTable: String!
    var workingDaysPassedFromTable: Int!

    var exsistingContract: NSManagedObject!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Load the view with the data passed from the table
        if (exsistingContract != nil) {

            self.title = "Edit Contract"

            var dateFormatter = NSDateFormatter()
            dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
            dateFormatter.dateStyle = NSDateFormatterStyle.MediumStyle
            dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
            dateFormatter.dateFormat = "dd-MM-yyyy"

            startDateTextField.text = dateFormatter.stringFromDate(startDatePassedFromTable)
            endDateTextField.text = dateFormatter.stringFromDate(endDatePassedFromTable)
            shipNameTextField.text = shipNamePassedFromTable
            positionOnBoardTextField.text = positionOnBoardPassedFromTable
            workingDaysLabel.text = "\(workingDaysPassedFromTable)"

        } else {
            self.title = "Add Contract"
        }
    }

    // Start Date Text Field- action and format for DatePicker
    @IBAction func startDateTextFieldEditing(sender: UITextField) {
        var datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("startDatePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func startDatePickerValueChanged(sender: UIDatePicker) {
        var dateformatter = NSDateFormatter()
        dateformatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
        dateformatter.dateFormat = "dd-MM-yyyy"
        startDateTextField.text = dateformatter.stringFromDate(sender.date)

        return calculateWorkingDays()
    }

    // End Date Text Field - action and format for DatePicker
    @IBAction func endDateTextFieldEditing(sender: UITextField) {
        var datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("endDatePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
    }

    func endDatePickerValueChanged(sender: UIDatePicker) {
        var dateformatter = NSDateFormatter()
        dateformatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
        dateformatter.dateStyle = NSDateFormatterStyle.MediumStyle
        dateformatter.dateFormat = "dd-MM-yyyy"
        endDateTextField.text = dateformatter.stringFromDate(sender.date)

        return calculateWorkingDays()
    }

    // Hide keyboard or DatePicker
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }

    // Calculate the working days from String -> NSDate of startDateTextField and endDateTextField
    func calculateWorkingDays() {

        // Check if the startDateTextField AND endDateTextField are not empty
        if !startDateTextField.text.isEmpty && !endDateTextField.text.isEmpty {

            // Date format and localisation
            let calendar = NSCalendar.currentCalendar()
            let unit: NSCalendarUnit = .CalendarUnitDay
            var dateFormatter = NSDateFormatter()
            dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
            dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
            dateFormatter.dateFormat = "dd-MM-yyyy"
            let startDatePicker: NSDate = dateFormatter.dateFromString(startDateTextField.text)!
            let endDatePicker: NSDate = dateFormatter.dateFromString(endDateTextField.text)!

            // Calculate the diference and set the workingDays Label to Days -> String from Int + 1
            let components = calendar.components(unit, fromDate: startDatePicker, toDate: endDatePicker, options: nil)
            workingDaysLabel.text = "\(components.day + 1)"
        }
    }

    @IBAction func buttonSavePressed(sender: UIBarButtonItem) {
        // Check for empty TextField
        if startDateTextField.text.isEmpty || endDateTextField.text.isEmpty || shipNameTextField.text.isEmpty || positionOnBoardTextField.text.isEmpty {
            // Allert message with OK button
            let alertController = UIAlertController(title: "Error Save Contract", message: "Start and End Date are required", preferredStyle: UIAlertControllerStyle.Alert)
            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil)
            alertController.addAction(okAction)
            presentViewController(alertController, animated: true, completion: nil)

        } else {
            // Save data and return to the root controller
            // Check if contract is exsisting and EDIT or NEW for save new contract
            var appDelegate: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
            var context: NSManagedObjectContext = appDelegate.managedObjectContext!
            let entity = NSEntityDescription.entityForName("Contract", inManagedObjectContext: context)!

            var dateFormatter = NSDateFormatter()
            dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX")
            dateFormatter.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
            dateFormatter.dateFormat = "dd-MM-yyyy"

            // Check if contract exsist
            if (exsistingContract != nil) {

                // Edit exsisting contract
                exsistingContract.setValue((dateFormatter.dateFromString(startDateTextField.text)), forKey: "startdate")
                exsistingContract.setValue((dateFormatter.dateFromString(endDateTextField.text)), forKey: "enddate")
                exsistingContract.setValue(shipNameTextField.text, forKey: "ship")
                exsistingContract.setValue(positionOnBoardTextField.text, forKey: "position")
                exsistingContract.setValue(workingDaysLabel.text?.toInt(), forKey: "workingdays")

            } else {

                // Create new contract
                var newContractData = Contract(entity: entity, insertIntoManagedObjectContext: context)
                newContractData.startdate = dateFormatter.dateFromString(startDateTextField.text)!
                newContractData.enddate = dateFormatter.dateFromString(endDateTextField.text)!
                newContractData.ship = shipNameTextField.text
                newContractData.position = positionOnBoardTextField.text
                newContractData.workingdays = workingDaysLabel.text!.toInt()!

            }

            // Save and return to root
            context.save(nil)
            self.navigationController?.popToRootViewControllerAnimated(true)

        }

    }

    @IBAction func cancelButtonPressed(sender: UIBarButtonItem) {
        self.navigationController?.popToRootViewControllerAnimated(true)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

最佳答案

您只能在 NSDateFormatter 上创建一个实例,并在需要的地方使用它:

lazy var dateFormatter: NSDateFormatter = {
    let f = NSDateFormatter()
    f.locale = NSLocale(localeIdentifier: "en_US_POSIX")
    f.timeZone = NSTimeZone(abbreviation: "GMT+0:00")
    f.dateFormat = "dd-MM-yyyy"
    return f
}()

关于ios - 具有多个 NSDateFormatter 的 Swift 代码 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30711879/

相关文章:

iphone - NSPredicate 基于此对象是否与另一个对象相关?

ios - iTunes 连接错误 : itc. olympus.partnermessage.lockey.contentprovider.contract.expiresoon.messagebody.app.free

iphone - App Store 发布新更新/版本时如何通知用户?

swift - "error: Couldn' t IRGen expression, no additional error"on Xcode 10.1 的解决方案是什么?

ios - 可选和隐式解包可选之间有什么区别?

iOS - 保持 Core Data 和 Neo4j 数据库同步

ios - 我应该在类之间共享 UIAlertView 吗?

ios - Apple 在其 + (NSMethodSignature *)signatureWithObjCTypes :(const char *)types 文档中的警告

ios - 未找到架构 x86_64 的符号 - iOS

ios - 将照片添加到我的应用程序并存储在核心数据中