Funciones matemáticas en Swift

95

¿Cómo utilizo como funciones matemáticas sqrt(), floor(), round(), sin(), etc?


Al hacer:

_ = floor(2.0)
_ = sqrt(2.0)

Yo obtengo:

error: uso de identificador no resuelto 'piso'
error: uso de identificador no resuelto 'sqrt'

ingrese la descripción de la imagen aquí

Giovanni
fuente
Si obtiene la Ambiguous reference to xrespuesta, consulte esta respuesta: stackoverflow.com/a/34357943/1359306
Patrick

Respuestas:

98

Como señalaron otros, tiene varias opciones. Si solo quieres funciones matemáticas. Solo puede importar Darwin.

import Darwin

Si desea funciones matemáticas y otras clases y funciones estándar. Puede importar Foundation.

import Foundation

Si quieres todo y también clases para la interfaz de usuario, depende de si tu patio de juegos es para OS X o iOS.

Para OS X, necesita importar Cocoa.

import Cocoa

Para iOS, necesita importar UIKit.

import UIKit

Puede descubrir fácilmente su plataforma de juegos abriendo File Inspector (⌥⌘1).

Configuración del área de juegos: plataforma

Tomáš Linhart
fuente
6
En el patio de recreo de Swift, aparece el error:No such module 'Cocoa'
David Poxon
@noilly: un poco tarde ahora, debe establecer el tipo de archivo en iOS en las propiedades del archivo de Playground (Cmd-Opt-0), o importar UIKit en su lugar, según el comentario anterior
Chris Conover
1
No existe tal módulo 'Cocoa'
Alexander Volkov
4
UIKit, Cocoa, Foundation, todas las opciones válidas.
erdekhayser
Importar Cocoa no funciona en aplicaciones de iOS. Aparece el error "No existe tal módulo 'Cocoa'. Si solo importa UIKit, obtendrá un error al usar sqrt ().
SomeGuy
77

Para ser perfectamente preciso, Darwin es suficiente. No es necesario importar todo el marco de Cocoa.

import Darwin

Por supuesto, si necesita elementos de Cocoa o Foundation u otros marcos de nivel superior, puede importarlos en su lugar

bpresles
fuente
Y con Swift 3+, no necesita Darwin (o Glibc) para sqrt, floory roundporque puede usar de forma nativa 0.5.squareRoot(), respectivamente , Int(0.5)y 0.5.round().
Cœur
17

Para las personas que usan swift [2.2] en Linux, es decir, Ubuntu, ¡la importación es diferente!

La forma correcta de hacer esto es usar Glibc. Esto se debe a que en OS X e iOS, las API básicas similares a Unix están en Darwin, pero en Linux, se encuentran en Glibc. Importar Foundation no lo ayudará aquí porque no hace la distinción por sí mismo. Para hacer esto, debe importarlo explícitamente usted mismo:

#if os(macOS) || os(iOS)
import Darwin
#elseif os(Linux) || CYGWIN
import Glibc
#endif

Puede seguir el desarrollo del marco Foundation aquí para obtener más información.


EDITAR: 26 de diciembre de 2018

Como se ha señalado por @ Coeur , a partir de 3,0 veloz algunas funciones matemáticas son ahora parte de los mismos tipos. Por ejemplo, Double ahora tiene una función squareRoot . Del mismo modo, ceil, floor, round, todo puede lograrse con Double.rounded(FloatingPointRoundingRule) -> Double.

Además, acabo de descargar e instalar la última versión estable de swift en Ubuntu 18.04, y parece que el Foundationmarco es todo lo que necesita importar para tener acceso a las funciones matemáticas ahora. Intenté encontrar documentación para esto, pero no surgió nada.

➜ swift          
Welcome to Swift version 4.2.1 (swift-4.2.1-RELEASE). Type :help for assistance.
  1> sqrt(9)
error: repl.swift:1:1: error: use of unresolved identifier 'sqrt'
sqrt(9)
^~~~


  1> import Foundation
  2> sqrt(9)
$R0: Double = 3
  3> floor(9.3)
$R1: Double = 9
  4> ceil(9.3) 
$R2: Double = 10
smac89
fuente
Y con Swift 3+, no necesita Darwin (o Glibc) para sqrt, floory roundporque puede usar de forma nativa 0.5.squareRoot(), respectivamente , Int(0.5)y 0.5.round().
Cœur
@ Cœur, he estado fuera de contacto con Swift por un tiempo. Quizás pueda ofrecer esta idea en forma de respuesta. Gracias
smac89
Porque pownecesitaba incluirlo Glibcpara Linux, ¡gracias!
A1rPun
10

Puede usarlos directamente en línea:

var square = 9.4
var floored = floor(square)
var root = sqrt(floored)

println("Starting with \(square), we rounded down to \(floored), then took the square root to end up with \(root)")
Ben Gottlieb
fuente
1
Recibo el siguiente error: uso del identificador 'sqrt' sin resolver.
Giovanni
Creo que espera que declare una función llamada sqrt, pero obviamente no es lo que quiero. Gracias
Giovanni
Necesita importar UIKit, Cocoa o Foundation.
Ben Gottlieb
¿Hay alguna función en la que pueda darle una matriz de Ints y luego Swift me devolvería una función de potencia de 2 (o 1, o 3, o lo que sea) que mejor se adapte a ella? como le doy: [1,2,3]volvería y = xo le daría [1, 4, 9] volvería y = x^2o algo parecido de esa maneraf(x)
Cariño
Me funciona, pero mi patio de recreo importa UIKit por defecto. Y también funciona, importando Foundation o Darwin en lugar de UIKit.
Timbergus
8

Para usar las funciones matemáticas tienes que import Cocoa

Puede ver las otras funciones matemáticas definidas de la siguiente manera. Haga un Cmd-Click en el nombre de la función sqrte ingrese el archivo con todas las demás funciones matemáticas globales y constanst.

Un pequeño fragmento del archivo

...
func pow(_: CDouble, _: CDouble) -> CDouble

func sqrtf(_: CFloat) -> CFloat
func sqrt(_: CDouble) -> CDouble

func erff(_: CFloat) -> CFloat
...
var M_LN10: CDouble { get } /* loge(10)       */
var M_PI: CDouble { get } /* pi             */
var M_PI_2: CDouble { get } /* pi/2           */
var M_SQRT2: CDouble { get } /* sqrt(2)        */
...
DanEEStar
fuente
1
Bueno, es una respuesta a la pregunta real "¿Cómo uso funciones matemáticas como sqrt (), floor (), round (), sin (), etc.?"
DanEEStar
2
No es una respuesta correcta. No son funciones globales. Tienes que import Cocoausarlos.
James Billingham
3

Para la forma Swift de hacer las cosas, puede probar y hacer uso de las herramientas disponibles en la Biblioteca estándar de Swift. Estos deberían funcionar en cualquier plataforma que pueda ejecutar Swift.

En lugar de floor(), round()y el resto de las rutinas de redondeo, puede utilizar rounded(_:):

let x = 6.5

// Equivalent to the C 'round' function:
print(x.rounded(.toNearestOrAwayFromZero))
// Prints "7.0"

// Equivalent to the C 'trunc' function:
print(x.rounded(.towardZero))
// Prints "6.0"

// Equivalent to the C 'ceil' function:
print(x.rounded(.up))
// Prints "7.0"

// Equivalent to the C 'floor' function:
print(x.rounded(.down))
// Prints "6.0"

Estos están disponibles actualmente en Floaty Doubledebería ser bastante fácil convertirlos a, CGFloatpor ejemplo.

En lugar de sqrt()está el squareRoot()método en el protocolo FloatingPoint. Nuevamente, ambos Floaty se Doubleajustan al FloatingPointprotocolo:

let x = 4.0
let y = x.squareRoot()

Para las funciones trigonométricas, la biblioteca estándar no puede ayudar, por lo que es mejor que importe Darwin en las plataformas Apple o Glibc en Linux. Con los dedos cruzados, serán una forma más ordenada en el futuro.

#if os(OSX) || os(iOS)
import Darwin
#elseif os(Linux)
import Glibc
#endif

let x = 1.571
print(sin(x))
// Prints "~1.0"
Difícil
fuente