Ho scritto una grande applicazione per iPhone di social networking, e uno dei maggiori problemi che ho incontrato è il fatto che NSInteger (e tutti gli altri tipi NS-non-object) non sono di prima classe cittadini. Questo problema deriva dal fatto che, ovviamente, non hanno alcuna rappresentazione per un valore nullo.Risolvendo NSInteger <-> NSNumero problema
Questo crea due problemi principali:
- Tonnellate di overhead e opacità per convertire da e verso NSNumber durante la memorizzazione/recupero da una collezione.
- Impossibile rappresentare nil. Spesso, voglio essere in grado di rappresentare un valore "non impostato".
Un modo per risolvere questo è utilizzare NSNumber tutto il tempo, ma questo diventa estremamente confuso. In un oggetto modello Utente, avrei circa 20 NSNumbers diversi, e nessun modo semplice per dire se ognuno è un float, intero, bool, ecc.
Quindi ecco i miei pensieri per le potenziali soluzioni e i pro/contro . Non sono davvero venduto su nessuno di essi, quindi ho pensato di chiedere un feedback e/o soluzioni alternative a questo problema.
- Continuare a utilizzare i tipi NSInteger e utilizzare solo NSIntegerMax per rappresentare nil.
PRO - Meno memoria in testa
PRO - Digitazione chiara
CON - NSIntegerMax non è proprio nulla. Se i programmatori non stanno attenti o non conoscono questa convenzione, i valori non validi potrebbero perdere nel livello di visualizzazione.
CON - non è in grado di memorizzare in una collezione senza conversioni in entrata e in uscita - Usa NSNumber e designare i tipi che usano la notazione ungherese (ad esempio NSNumber fHeight, NSNumber iage)
PRO - cittadini di prima classe
PRO - problema risolto Nil
CON - Aumento overhead di memoria
CON - perdere tipo compilatore verifica
CON - notazione ungherese è controversa - scrivere la mia prima classe tipi di oggetti primitivi (si pensi Java http://developer.android.com/reference/java/lang/Integer.html)
PRO - cittadini di prima classe
PRO - Nil problema risolto
PRO - Mantiene tipo compilatore verifica
PRO - Oggetti sarà più semplice di NSNumber. La memoria interna sarà specifica per il tipo di dati.
CON - Aumento della memoria in testa
CON - sacrifica un po 'di portabilità dei codici e la compatibilità
Alla ricerca di un argomento convincente a favore di una di queste tecniche, o uno che non ho pensato a se' ce l'ho.
UPDATE
Sono andato avanti e ha iniziato un progetto open source (Apache 2.0), in cui tratterò un numero delle nostre classi interne come ho tempo. Attualmente include wrapper di oggetti per alcuni dei più comuni tipi di dati nativi (BOOL, CGFloat, NSInteger, NSUInteger). Abbiamo scelto di farlo perché aggiorna questi tipi di dati a cittadini di prima classe con una tipizzazione rigorosa. Forse non sei d'accordo con questo approccio, ma ha funzionato bene per noi, quindi sentiti libero di usarlo se vuoi.
Sto aggiungendo altre classi che abbiamo trovato usi per, tra cui una cache su disco-backed LRU, un oggetto "Pair", un pool di rilascio di memoria insufficiente, ecc
Godetevi github - Zoosk/ZSFoundation
questo mi sembra community wiki :) – LordT
Se desideri che i numeri siano cittadini di prima classe in Objective-C, invia una richiesta di funzionalità all'indirizzo http://bugreport.apple.com. Sarà contrassegnato come duplicato, ma maggiore è il numero di duplicati, meglio è (dal momento che ricorda agli sviluppatori della lingua che le persone hanno bisogno di determinate funzionalità). –
@DougW, stai pensando di aggiungere a ZSFloat 'compare: withPrecision'? –