Fonctions mathématiques dans Swift

95

Comment puis-je utiliser des fonctions mathématiques comme sqrt(), floor(), round(), sin(), etc?


En faisant:

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

Je reçois:

erreur: utilisation de l'identifiant non résolu 'étage'
erreur: utilisation de l'identifiant non résolu 'sqrt'

entrez la description de l'image ici

Giovanni
la source
Si vous obtenez la Ambiguous reference to xréponse, vérifiez cette réponse: stackoverflow.com/a/34357943/1359306
Patrick

Réponses:

98

Comme d'autres l'ont noté, vous avez plusieurs options. Si vous ne voulez que des fonctions mathématiques. Vous ne pouvez importer que Darwin.

import Darwin

Si vous voulez des fonctions mathématiques et d'autres classes et fonctions standard. Vous pouvez importer Foundation.

import Foundation

Si vous voulez tout et aussi des classes pour l'interface utilisateur, cela dépend si votre terrain de jeu est pour OS X ou iOS.

Pour OS X, vous devez importer Cocoa.

import Cocoa

Pour iOS, vous devez importer UIKit.

import UIKit

Vous pouvez facilement découvrir votre plate-forme de jeu en ouvrant l'inspecteur de fichiers (⌥⌘1).

Paramètres du terrain de jeu - Plateforme

Tomáš Linhart
la source
6
Dans le terrain de jeu Swift, j'obtiens l'erreur:No such module 'Cocoa'
David Poxon
@noilly: un peu tard maintenant, vous devez définir le type de fichier sur iOS dans les propriétés de fichier du Playground (Cmd-Opt-0), ou importer UIKit à la place, par commentaire ci-dessus
Chris Conover
1
Aucun module de ce type 'Cocoa'
Alexander Volkov
4
UIKit, Cocoa, Foundation, tous les choix valides.
erdekhayser
L'importation de Cocoa ne fonctionne pas dans les applications iOS. L'erreur "No such module 'Cocoa' arrive. Si vous importez simplement UIKit, vous obtenez une erreur lors de l'utilisation de sqrt ().
SomeGuy
77

Pour être parfaitement précis, Darwin suffit. Pas besoin d'importer tout le framework Cocoa.

import Darwin

Bien sûr, si vous avez besoin d'éléments de Cocoa ou Foundation ou d'autres frameworks de niveau supérieur, vous pouvez les importer à la place

bprésles
la source
Et avec Swift 3+, vous n'avez pas besoin de Darwin (ou Glibc) pour sqrt, flooret roundparce que vous pouvez utiliser nativement respectivement 0.5.squareRoot(), Int(0.5)et 0.5.round().
Cœur
17

Pour les personnes utilisant swift [2.2] sous Linux, c'est-à-dire Ubuntu, l'importation est différente!

La bonne façon de faire est d'utiliser Glibc. C'est parce que sur OS X et iOS, les API de base de type Unix sont dans Darwin mais sous Linux, elles sont situées dans Glibc. Importer Foundation ne vous aidera pas ici car il ne fait pas la distinction en soi. Pour ce faire, vous devez l'importer vous-même explicitement:

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

Vous pouvez suivre le développement du framework Foundation ici pour en savoir plus


EDIT: 26 décembre 2018

Comme souligné par @ Cœur , à partir de rapide 3.0 certaines fonctions mathématiques font maintenant partie des types eux - mêmes. Par exemple, Double a maintenant une fonction squareRoot . De même, ceil, floor, round, peuvent tous être atteints avecDouble.rounded(FloatingPointRoundingRule) -> Double .

De plus, je viens de télécharger et d'installer la dernière version stable de swift sur Ubuntu 18.04, et il semble que le Foundationframework soit tout ce dont vous avez besoin pour importer pour avoir accès aux fonctions mathématiques maintenant. J'ai essayé de trouver de la documentation pour cela, mais rien ne s'est produit.

➜ 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
la source
Et avec Swift 3+, vous n'avez pas besoin de Darwin (ou Glibc) pour sqrt, flooret roundparce que vous pouvez utiliser nativement respectivement 0.5.squareRoot(), Int(0.5)et 0.5.round().
Cœur
@ Cœur, je suis déconnecté de Swift depuis un moment. Peut-être pouvez-vous offrir cette idée sous forme de réponse. Merci
smac89
Car powj'avais besoin d'inclure Glibcpour Linux, merci!
A1rPun
10

Vous pouvez les utiliser directement en ligne:

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
la source
1
J'obtiens l'erreur suivante: utilisation de l'identifiant non résolu «sqrt».
Giovanni
Je pense que cela m'attend à déclarer une fonction appelée sqrt, mais ce n'est évidemment pas ce que je veux. Merci
Giovanni
Vous devez importer UIKit, Cocoa ou Foundation.
Ben Gottlieb
y a-t-il une fonction où je peux lui donner un tableau d'Ints et ensuite Swift me retournerait une fonction de puissance de 2 (ou 1, ou 3, ou autre) qui lui correspond le mieux? comme je le donne: [1,2,3]il reviendrait y = xou je le donnerais [1,4,9] il reviendrait y = x^2ou quelque chose se fermait simplement de cette manièref(x)
Chérie
Cela fonctionne pour moi, mais mon terrain de jeu importe UIKit par défaut. Et cela fonctionne aussi, en important Foundation ou Darwin à la place UIKit.
Timbergus
8

Pour utiliser les fonctions mathématiques, vous devez import Cocoa

Vous pouvez voir les autres fonctions mathématiques définies de la manière suivante. Faites un Cmd-Cliquez sur le nom de la fonctionsqrt et vous entrez le fichier avec toutes les autres fonctions mathématiques globales et constanst.

Un petit extrait du fichier

...
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
la source
1
Eh bien, c'est une réponse à la question réelle "Comment utiliser des fonctions mathématiques comme sqrt (), floor (), round (), sin (), etc?"
DanEEStar
2
Ce n'est pas une bonne réponse. Ce ne sont pas des fonctions globales. Vous devez les import Cocoautiliser.
James Billingham
3

Pour la manière Swift de faire les choses, vous pouvez essayer d'utiliser les outils disponibles dans la bibliothèque standard Swift. Ceux-ci devraient fonctionner sur n'importe quelle plate-forme capable d'exécuter Swift.

Au lieu de floor(), round()et le reste des routines d'arrondi, vous pouvez utiliser 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"

Ceux-ci sont actuellement disponibles sur Floatet Doubleet il devrait être assez facile de les convertir en un CGFloatpar exemple.

Au lieu de cela, sqrt()il y a la squareRoot()méthode sur le protocole FloatingPoint. Encore une fois, à la fois Floatet Doubleconforme au FloatingPointprotocole:

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

Pour les fonctions trigonométriques, la bibliothèque standard ne peut pas aider, il vaut donc mieux importer Darwin sur les plates-formes Apple ou Glibc sous Linux. Croisés les doigts, ils seront d'une manière plus soignée à l'avenir.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Rusé
la source