Swift

2016-04-11 34 views
1

içinde bir sözlük oluşturmak için azaltmak() kullanma işlevli bir program stili kullanarak sözlük oluşturmak istiyorum. Benim azaltmak() çalışmak için görünmüyor - Ben olsun: Sizin retVal isteğe bağlıdırSwift

func loadMoveToCalendarsRules(calendarIndex: Int) -> [String]? { 
// return something like ["phone call", "buzz", "ring"] 
    return NSUserDefaults.standardUserDefaults().objectForKey(generateMoveToCalendarsRules_NSUserDefaultsKey(calendarIndex)) as? [String] 
} 

// Add indeces to an array of any type 
func addIndices<T>(toArray: [T]) -> [(index: Int, value: T)] { 
    return Array(zip(toArray.indices, toArray)) 
} 

typealias CalendarRules = [EKCalendar : [String]]? 
func buildCalendarRules(cals: [EKCalendar]) -> CalendarRules { 
    let sortedCals = cals.sort { $0.title.lowercaseString < $1.title.lowercaseString } 

    // build move to cal rules. 
    let indexedCalList = addIndices(sortedCals) 
    // go through the sorted calendars and build a dictionary that associates each calendar with a string array. (These are keywords that apply to the given calendar.) 
    let calendarRules = indexedCalList.reduce(nil as CalendarRules) { 
     accumulator, nextValue in 
     var retVal: [EKCalendar : [String]]? = accumulator 
     // if there are values found in NSUserDefaults for this calendar index then retrieve them. 
     if let rulesForCurrentCal = loadMoveToCalendarsRules(nextValue.index) { 
      retVal![nextValue.value] = rulesForCurrentCal  // fatal error: unexpectedly found nil while unwrapping an Optional value 
     } 
     return retVal 
    } 

    print("------------ built calendar rules -------------") 
    print(Array(arrayLiteral: calendarRules?.keys)) 
    print(Array(arrayLiteral: calendarRules?.values)) 

    return calendarRules 
} 

cevap

1

"önemli bir hatayla beklenmedik bir Opsiyonel değerini unwrapping ederken nil bulundu" ve geçmek nil (başlangıç ​​değeri olarak başlar), henüz zorla açmak için retVal! kullanıyorsunuz. İlk değer olarak [:] (boş bir sözlüğü) kullanabilir ve daha sonra retVal'un isteğe bağlı olması gerekmeyebilir.

1

nil ile başlıyorsunuz ve CalendarRules sözlüğünü başlatmıyorsunuz, bu nedenle, ! ile zorunlu bir sıkıştırmayı gerçekleştirme denemesi başarısız oluyor. Bunun yerine, nil olup olmadığını sınayın ve eğer varsa, bir örneği oluşturun.

Bunu yapmadan önce, önce takvim kurallarını isteğe bağlı olmayan bir tür olarak tanımlamayı öneririm.

let calendarRules = indexedCalList.reduce(nil as CalendarRules?) { accumulator, nextValue in 
    if let rulesForCurrentCal = loadMoveToCalendarsRules(nextValue.index) { 
     var retVal = accumulator ?? CalendarRules() 
     retVal[nextValue.value] = rulesForCurrentCal 
     return retVal 
    } 
    return accumulator 
} 

Beni dahası var olabileceğini grev: gerektiğinde CalendarRules nesne örneğini oluşturmak için nil -coalescing operatörü, ??, kullanabilirsiniz, Sonra

typealias CalendarRules = [EKCalendar : [String]] 

: Olayların az kafa karıştırıcı bu şekilde yapar verimli yaklaşımlar, ancak bu "beklenmedik şekilde bulunan sıfır" hatasını ele almalıdır.