the programming para linea language descargar apple ios swift swift3

ios - programming - xcode en linea



Swift 3 Decimal, NSDecimal y NSDecimalNumber (2)

Estoy tratando de usar NumberFormatter con Swift 3 Decimal , pero estoy confundido sobre cómo se está implementando realmente Decimal . El problema que tengo es que Decimal es una estructura, por lo que tengo que relacionarlo con un NSDecimalNumber cada vez que quiero usar un formateador, lo cual me gustaría evitar.

let formatter = NumberFormatter() formatter.numberStyle = .decimal let decimal = Decimal(integerLiteral: 3) let string = formatter.string(from: decimal as NSDecimalNumber)

¿Es la solución ideal para esto implementar mi propia extensión que toma un Decimal ?

extension NumberFormatter { open func string(from number: Decimal) -> String? { return string(from: number as NSDecimalNumber) } }

De manera más general, cada vez que necesito pasar un tipo de objeto, ¿tendré que puentear el Decimal o escribir más extensiones?

EDITAR

Supongo que me pregunto en general sobre NSDecimal Decimal y NSDecimalNumber en Swift 3. No tengo claro qué está pasando aquí. ¿Debo reemplazar NSDecimalNumber con Decimal para Swift 3? Los documentos escriben:

La superposición de Swift al marco de Foundation proporciona la estructura Decimal, que se une a la clase NSDecimalNumber. El tipo de valor Decimal ofrece la misma funcionalidad que el tipo de referencia NSDecimalNumber, y los dos se pueden usar indistintamente en el código Swift que interactúa con las API de Objective-C. Este comportamiento es similar a cómo Swift une los tipos estándar de cadena, numéricos y de colección con sus clases Foundation correspondientes.

Lo que al principio pensé que significaba que Decimal era el nuevo NSDecimalNumber como Error es el nuevo NSError , pero ahora no estoy tan seguro. Eso también dice: "El tipo de valor decimal ofrece la misma funcionalidad que el tipo de referencia NSDecimalNumber". ¿Es esto realmente cierto? Parece que no puedo obtener la misma funcionalidad (sin cruzarlo primero, por supuesto, ¿es eso lo que quieren decir?). He encontrado algunas publicaciones y un poco de información aquí y allá, pero nada tan convincente. ¿Alguien tiene algún conocimiento o idea?

Mi aplicación está utilizando específicamente NSDecimalNumber para la moneda y el formato, por lo que el redondeo y el formateo son de alta prioridad.


Hice mi pregunta en el panel de usuarios rápidos y obtuve una respuesta maravillosa, mira esto aquí: https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20161219/004220.html

Versión de texto de la respuesta:

Swift 3 introdujo la clase Decimal, que al principio pensé que se suponía que debía ''reemplazar'' NSDecimalNumber en Swift, como Error es el nuevo NSError, etc. Sin embargo, tras una investigación más a fondo, no es claro para mí que este sea realmente el caso. Parece que Swift 3''s Decimal es más simplemente un NSDecimal, pero con algunos puentes, por lo que puede usar los métodos de NSDecimalNumber cuando sea necesario. Lo que me pregunto es, ¿debería reemplazar NSDecimalNumber en mi aplicación con Decimal? ¿Decimal es el sucesor de NSDecimalNumber en Swift?

Decimal es en realidad una estructura, no una clase, y de hecho es solo el nombre Swift para la estructura NSDecimal en Objective-C. En Swift, las funciones como NSDecimalAdd se exponen como operadores en Decimal y se utilizan para satisfacer los requisitos de varios protocolos numéricos como SignedNumber .

El resultado final es que Decimal se parece mucho a Int o Double ; es un tipo de valor que se puede usar convenientemente para hacer todo tipo de operaciones matemáticas. NSDecimalNumber , entonces, es equivalente a NSNumber .

Como mi aplicación está formateando mucho, se necesitaría mucha conversión entre Decimal y NSDecimalNumber, o agregar extensiones para usar, por lo que no creo que sea natural / conveniente sin muchas extensiones. ¿Está planeando Swift mejorar el Decimal para que sea más útil con NumberFormatter u otras API de números orientadas a objetos? Espero haber dado suficiente información para responder mi pregunta.

Las API de Objective-C que usan NSDecimalNumber deben puentear a Decimal , del mismo modo que NSString se NSString a String . Sin embargo, ese puente puede no funcionar para los métodos de categoría; NSDecimalNumber exponerlos a Swift escribiendo una extensión en Decimal que self NSDecimalNumber a NSDecimalNumber y luego llama a sus métodos de Objective-C.

De forma similar, debería poder usar Decimal con NumberFormatter al NSDecimalNumber a NSDecimalNumber , tal como lo haría con Int o Double en NSNumber para usarlos con NumberFormatter .


Usa este código:

let formatter = NumberFormatter() formatter.numberStyle = .decimal let string = formatter.string(from: NSNumber(integerLiteral: 3))