Funzioni matematiche in Swift


95

Come posso utilizzare le funzioni matematiche come sqrt(), floor(), round(), sin(), ecc?


Quando si fa:

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

Ottengo:

errore: utilizzo dell'identificatore non risolto "floor"
errore: utilizzo dell'identificatore non risolto "sqrt"

inserisci qui la descrizione dell'immagine


Se ottieni il Ambiguous reference to xcontrollo questa risposta: stackoverflow.com/a/34357943/1359306
Patrick

Risposte:


98

Come altri hanno notato, hai diverse opzioni. Se vuoi solo funzioni matematiche. Puoi importare solo Darwin.

import Darwin

Se vuoi funzioni matematiche e altre classi e funzioni standard. Puoi importare Foundation.

import Foundation

Se vuoi tutto e anche le classi per l'interfaccia utente, dipende se il tuo playground è per OS X o iOS.

Per OS X, è necessario importare Cocoa.

import Cocoa

Per iOS, è necessario importare UIKit.

import UIKit

Puoi scoprire facilmente la tua piattaforma playground aprendo File Inspector (⌥⌘1).

Impostazioni del parco giochi - Piattaforma


6
Nel playground Swift, ottengo l'errore:No such module 'Cocoa'
David Poxon

@noilly: un po 'tardi adesso, devi impostare il tipo di file su iOS nelle proprietà del file di Playground (Cmd-Opt-0), o importare invece UIKit, come da commento sopra
Chris Conover

1
Nessun modulo di questo tipo "Cocoa"
Alexander Volkov

4
UIKit, Cocoa, Foundation, tutte scelte valide.
erdekhayser

L'importazione di Cocoa non funziona nelle applicazioni iOS. Viene visualizzato l'errore "Nessun modulo simile" Cocoa ". Se importi UIKit, viene visualizzato un errore durante l'utilizzo di sqrt ().
SomeGuy

77

Per essere perfettamente precisi, Darwin è sufficiente. Non è necessario importare l'intero framework Cocoa.

import Darwin

Ovviamente, se hai bisogno di elementi da Cocoa o Foundation o altri framework di livello superiore, puoi invece importarli


E con Swift 3+, non hai bisogno di Darwin (o Glibc) per sqrt, floore roundpoiché puoi usare nativamente rispettivamente 0.5.squareRoot(), Int(0.5)e 0.5.round().
Cœur

17

Per le persone che utilizzano swift [2.2] su Linux, ad esempio Ubuntu, l'importazione è diversa!

Il modo corretto per farlo è usare Glibc. Questo perché su OS X e iOS, le API di base simili a Unix sono in Darwin ma in Linux, queste si trovano in Glibc. Importare Foundation non ti aiuterà qui perché non fa la distinzione da solo. Per fare ciò, devi importarlo esplicitamente da solo:

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

Puoi seguire lo sviluppo del framework Foundation qui per saperne di più


EDIT: 26 dicembre 2018

Come sottolineato da @ Cœur , a partire da swift 3.0 alcune funzioni matematiche fanno ora parte dei tipi stessi. Ad esempio, Double ora ha una funzione squareRoot . Analogamente, ceil, floor, round, possono tutti essere realizzato con Double.rounded(FloatingPointRoundingRule) -> Double.

Inoltre, ho appena scaricato e installato l'ultima versione stabile di swift su Ubuntu 18.04, e sembra che Foundationframework sia tutto ciò di cui hai bisogno per importare per avere accesso alle funzioni matematiche ora. Ho provato a trovare la documentazione per questo, ma non è venuto fuori nulla.

➜ 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

E con Swift 3+, non hai bisogno di Darwin (o Glibc) per sqrt, floore roundpoiché puoi usare nativamente rispettivamente 0.5.squareRoot(), Int(0.5)e 0.5.round().
Cœur

@ Cœur, sono stato fuori contatto con Swift per un po '. Forse puoi offrire questa intuizione sotto forma di risposta. Grazie
smac89

Perché powavevo bisogno di includere Glibcper Linux, grazie!
A1rPun

10

Puoi usarli direttamente in linea:

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)")

1
Ottengo il seguente errore: utilizzo dell'identificatore non risolto "sqrt".
Giovanni

Penso che si aspetti che dichiari una funzione chiamata sqrt, ma ovviamente non è quello che voglio. Grazie
Giovanni

Devi importare UIKit, o Cocoa o Foundation.
Ben Gottlieb

c'è una funzione in cui posso dargli un array di Ints e poi Swift mi restituirebbe una funzione di potenza di 2 (o 1, o 3, o qualsiasi altra cosa) che meglio si adatta? come lo do io: [1,2,3]sarebbe tornato y = xo lo avrei dato [1,4,9] sarebbe tornato y = x^2o qualcosa si sarebbe semplicemente chiuso in quel modo dif(x)
Honey

Per me funziona, ma il mio playground importa UIKit per impostazione predefinita. E funziona anche importando Foundation o Darwin invece di UIKit.
Timbergus

8

Per usare le funzioni matematiche devi import Cocoa

Puoi vedere le altre funzioni matematiche definite nel modo seguente. Fai un Cmd-Click sul nome della funzionesqrt e inserisci il file con tutte le altre funzioni matematiche globali e costanti.

Un piccolo frammento del file

...
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)        */
...

1
Beh, è ​​una risposta alla domanda reale "Come posso usare funzioni matematiche come sqrt (), floor (), round (), sin (), ecc?"
DanEEStar

2
Non è una risposta corretta. Non sono funzioni globali. Devi import Cocoausarli.
James Billingham

3

Per il modo Swift di fare le cose, puoi provare a utilizzare gli strumenti disponibili nella libreria Swift Standard. Dovrebbero funzionare su qualsiasi piattaforma in grado di eseguire Swift.

Invece di floor(), round()e il resto delle routine di arrotondamento che è possibile utilizzare 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"

Questi sono attualmente disponibili su Floate Doublee dovrebbe essere abbastanza facile convertirli in un file, CGFloatad esempio.

Invece di sqrt()c'è il squareRoot()metodo sul protocollo FloatingPoint. Di nuovo, entrambi Floate Doubleconformi al FloatingPointprotocollo:

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

Per le funzioni trigonometriche, la libreria standard non può essere d'aiuto, quindi è meglio importare Darwin sulle piattaforme Apple o Glibc su Linux. Incrociamo le dita, saranno un modo più ordinato in futuro.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.