2015-02-13 5 views
0

Я пытаюсь реализовать протокол Hashable для своего объекта, используя EVCloudKitDao, где все свойства будут использоваться для хэша с помощью отражения. Для некоторых свойств я получаю ошибку: ..hash дать EXC_BREAKPOINT (code = EXC_ARM_BREAKBOINT

EXC_BREAKPOINT (code=EXC_ARM_BREAKBOINT

Когда я отфильтровывать ключ в том, что есть такая проблема, то иногда ключ, который пошел хорошо, прежде чем внезапно получить эту ошибку

Вот скриншот ошибки:

enter image description here

Весь код, который имеет эту проблему, можно найти по адресу: EVReflection.swift

Я получаю ошибку момент я запросить .hash на объекте, который имеет EVCloudKitDataObject, как это базовый объект.

ответ

1

Эта проблема возникла из-за переполнения Int. После изменения кода, что вы видите ниже ошибка исчезла:

public class func hashValue(theObject: NSObject) -> Int { 
    var hash : Int = 0 
    var counter : Int = 0 
    for (key, value) in toDictionary(theObject) { 
     hash = hash &+ (value.hash << counter) 
     counter = counter + 1 
    } 
    return Int(hash) 
} 

Для получения дополнительной информации смотрите раздел «операторов Overflow» в документации яблоко на https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html

Теперь даже упрощен и с использованием 31 * старый хэш + newhash:

public class func hashValue(theObject: NSObject) -> Int { 
    return Int(map(toDictionary(theObject)) {$1}.reduce(0) {(31 &* $0) &+ $1.hash}) 
} 
Смежные вопросы