-1

In this code, I am trying to extract week days from a string. I created a dictionary named dayDictionary to access to week days faster

dayDictionary is populated perfectly, but I can't access the element, it always returning nil

dictionary accessing code snip is

for word in components {
        //print(String (word))

        if previous == "to" {
            //print("Hi end")
            endIndex = dayDictionary[String (word)] ?? -1
            break
        }

        if word == "to" {
            //print("Hi Start")

            startIndex = dayDictionary[previous] ?? -1
            continue
        }

        if let validIndex = dayDictionary[String (word)] {
            duration += [validIndex]
            print("Valid")
        }

        previous = String (word)
    }

Here's the full code for better understanding

func findWeekDays(sentence: String, weekdays: [String]) -> [Int] {
    var dayDictionary: [String : Int] = [:]

    for index in 0..<weekdays.count {
        dayDictionary[weekdays[index]] = index
    }

    print(dayDictionary)

    sentence.lowercased()
    let components = sentence.split{ !$0.isLetter }

    var duration: [Int] = []

    var startIndex: Int = -1
    var endIndex: Int = -1
    var previous: String = ""

    for word in components {
        //print(String (word))

        if previous == "to" {
            //print("Hi end")
            endIndex = dayDictionary[String (word)] ?? -1
            break
        }

        if word == "to" {
            //print("Hi Start")

            startIndex = dayDictionary[previous] ?? -1
            continue
        }

        if let validIndex = dayDictionary[String (word)] {
            duration += [validIndex]
            print("Valid")
        }

        previous = String (word)
    }

    //print("\(startIndex), \(endIndex)")

    if startIndex != -1 && endIndex != -1 {
        if startIndex > endIndex {
            for index in startIndex...6 {
                duration += [index]
            }

            for index in 0...endIndex {
                duration += [index]
            }
        }

    }

    duration.sort()

    if duration.count == 0 {
        duration += [0, 1, 2, 3, 4, 5, 6]
    }

    return duration
}

func userInput() {
    let weekdays: [String] = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]

    let userSting: String = "Set alarm Monday to Friday"

    let dayIndex: [Int] = findWeekDays(sentence: userSting, weekdays: weekdays)

    for index in dayIndex {
        print("\(weekdays[index])")
    }
}

userInput()
SHAH MD IMRAN HOSSAIN
  • 2,558
  • 2
  • 25
  • 44

1 Answers1

1

You should use dayDictionary[word.description.lowercased()] instead of dayDictionary[String(word)]

I tried with Playground and I added some print lines to for loop ->

for word in components {
    print("word is: \(word)")
    print("components is: \(components)")
    print("previous is: \(previous)")
    print("dayDictionary is: \(dayDictionary)")
    print("item in dayDict is: \(dayDictionary[word.description.lowercased()])")

    if previous == "to" {
        print("Hi end")
        endIndex = dayDictionary[String(word)] ?? -1
        break
    }

    if word == "to" {
        print("Hi Start")

        startIndex = dayDictionary[previous] ?? -1
        continue
    }

    if let validIndex = dayDictionary[word.description.lowercased()] {
        duration += [validIndex]
        print("Valid")
    }

    previous = String(word)
    print("---------------------------------------")
}

Then the output is:

1st iteration

word is: Set
components is: ["Set", "alarm", "Monday", "to", "Friday"]
previous is: 
dayDictionary is: ["tuesday": 1, "wednesday": 2, "saturday": 5, "monday": 0, "thursday": 3, "sunday": 6, "friday": 4]
item in dayDict is: nil
---------------------------------------

2nd iteration

word is: alarm
components is: ["Set", "alarm", "Monday", "to", "Friday"]
previous is: Set
dayDictionary is: ["tuesday": 1, "wednesday": 2, "saturday": 5, "monday": 0, "thursday": 3, "sunday": 6, "friday": 4]
item in dayDict is: nil
---------------------------------------

3rd iteration

word is: Monday
components is: ["Set", "alarm", "Monday", "to", "Friday"]
previous is: alarm
dayDictionary is: ["tuesday": 1, "wednesday": 2, "saturday": 5, "monday": 0, "thursday": 3, "sunday": 6, "friday": 4]
item in dayDict is: Optional(0)
Valid
---------------------------------------

4th iteration

word is: to
components is: ["Set", "alarm", "Monday", "to", "Friday"]
previous is: Monday
dayDictionary is: ["tuesday": 1, "wednesday": 2, "saturday": 5, "monday": 0, "thursday": 3, "sunday": 6, "friday": 4]
item in dayDict is: nil
Hi Start

5th iteration

word is: Friday
components is: ["Set", "alarm", "Monday", "to", "Friday"]
previous is: Monday
dayDictionary is: ["tuesday": 1, "wednesday": 2, "saturday": 5, "monday": 0, "thursday": 3, "sunday": 6, "friday": 4]
item in dayDict is: Optional(4)
Valid
---------------------------------------

Please look at the third and fifth iterations. We could get the item from dayDictionary.

emrcftci
  • 3,355
  • 3
  • 21
  • 35