Search code examples
iosswiftuitableviewidentifier

Use of unresolved identifier - UITableView


I'm trying to make uitableview with days of the week. First should be always current day. But I have simple problem with import identifier. This is my code:

class SecondViewController: UIViewController, UITableViewDataSource,  UITableViewDelegate {
 @IBOutlet var tableView: UITableView!

 //Define Days Of The Week

 let calendar = NSCalendar.currentCalendar()
 let today = NSDate()

 let AddOneDay = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 1,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 let AddTwoDays = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 2,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 let AddThreeDays = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 3,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 let AddFourDays = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 4,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 let AddFiveDays = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 5,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 let AddSixDays = NSCalendar.currentCalendar().dateByAddingUnit(
     .Day,
     value: 6,
     toDate: NSDate(),
     options: NSCalendarOptions(rawValue: 0))

 func convertDaysFormater(date: String) -> String {
     let daysFormatter = NSDateFormatter()
     daysFormatter.dateFormat = "EEEE"
     daysFormatter.locale = NSLocale(localeIdentifier: "pl_PL")
     let convertedOneDay = daysFormatter.stringFromDate(AddOneDay!)
     let convertedTwoDays = daysFormatter.stringFromDate(AddTwoDays!)
     let convertedThreeDays = daysFormatter.stringFromDate(AddThreeDays!)
     let convertedFourDays = daysFormatter.stringFromDate(AddFourDays!)
     let convertedFiveDays = daysFormatter.stringFromDate(AddFiveDays!)
     let convertedSixDays = daysFormatter.stringFromDate(AddSixDays!)

     return convertedOneDay
     return convertedTwoDays
     return convertedThreeDays
     return convertedFourDays
     return convertedFiveDays
     return convertedSixDays

 }

 // Define Array

 let textCellIdentifier = "TextCell"

 let swiftBlogs = [convertedOneDay, convertedTwoDays, etc...]

Can't put convertedOneDay - 'Use of unresolved identifier' error. Thanks for any help ;)


Solution

  • You have a lot of similar code for example:

    let AddOneDay = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 1,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    
     let AddTwoDays = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 2,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    
     let AddThreeDays = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 3,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    
     let AddFourDays = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 4,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    
     let AddFiveDays = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 5,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    
     let AddSixDays = NSCalendar.currentCalendar().dateByAddingUnit(
         .Day,
         value: 6,
         toDate: NSDate(),
         options: NSCalendarOptions(rawValue: 0))
    

    Only the variable name and value change for each of these it would be more efficient to story this an in array of NSDates. For example:

    let futureDates:[NSDate] = {
        var futureDates = [NSDate]()
        for index in 1 ... 6 // Range starting tomorrow and going up to 6 days
        {
            let futureDate = NSCalendar.currentCalendar().dateByAddingUnit(
                .Day,
                value: index,
                toDate: NSDate(),
                options: NSCalendarOptions(rawValue: 0))
            futureDates.append(futureDate!)
        }
        return futureDates
    }()
    

    This way it would be trivial to change what days you want to look at. You simply change the range to iterate over.

    The problem you are running into is you are attempting to use convertedOneDay outside of its scope. Because you declare convertedOneDay in convertDaysFormater it can only be used in that function.

    Your convertDaysFormater function could also be improved. Right now, you are not using the parameter and as Phillip Mills points out once you call return you exit the function so subsequent returns are not executed. I propose you change the function to accept one date and return one string like so:

    func convertDaysFormatter(date:NSDate) -> String {
        let daysFormatter = NSDateFormatter()
        daysFormatter.dateFormat = "EEEE"
        daysFormatter.locale = NSLocale(localeIdentifier: "pl_PL")
        return daysFormatter.stringFromDate(date)
    }
    

    We can now use our futureDates and our convertDaysFormatter function to generate the swiftBlogs array you want. By saying something like:

    let swiftBlogs:[String] = {
        var swiftBlogs = [String]()
        for date in futureDates
        {
            swiftBlogs.append(convertDaysFormatter(date))
        }
        return swiftBlogs
    }()
    

    We just take each date from futureDates and use convertDaysFormatter to return the appropriate string that we append to our array. In swift you can say this even more concisely by simply saying:

    let swiftBlogs = futureDates.map{convertDaysFormatter($0)}
    

    When I run this code I get that swiftBlogs is equal to:

    ["niedziela", "poniedziałek", "wtorek", "środa", "czwartek", "piątek"]