Mathematische Funktionen in Swift

95

Wie verwende ich mathematische Funktionen wie sqrt(), floor(), round(), sin(), etc?


Dabei:

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

Ich bekomme:

Fehler: Verwendung des nicht aufgelösten Bezeichners 'Etage'
Fehler: Verwendung des nicht aufgelösten Bezeichners 'sqrt'

Geben Sie hier die Bildbeschreibung ein

Giovanni
quelle
Wenn Sie die Ambiguous reference to xAntwort erhalten, überprüfen Sie diese Antwort: stackoverflow.com/a/34357943/1359306
Patrick

Antworten:

98

Wie bereits erwähnt, haben Sie mehrere Möglichkeiten. Wenn Sie nur mathematische Funktionen wollen. Sie können nur Darwin importieren.

import Darwin

Wenn Sie mathematische Funktionen und andere Standardklassen und -funktionen wünschen. Sie können Foundation importieren.

import Foundation

Wenn Sie alles und auch Klassen für die Benutzeroberfläche möchten, hängt es davon ab, ob Ihr Spielplatz für OS X oder iOS ist.

Für OS X müssen Sie Cocoa importieren.

import Cocoa

Für iOS müssen Sie UIKit importieren.

import UIKit

Sie können Ihre Spielplatzplattform leicht entdecken, indem Sie den Dateiinspektor (⌥⌘1) öffnen.

Spielplatzeinstellungen - Plattform

Tomáš Linhart
quelle
6
Auf dem Swift-Spielplatz erhalte ich die Fehlermeldung:No such module 'Cocoa'
David Poxon
@noilly: Etwas spät, Sie müssen den Dateityp in den Dateieigenschaften des Spielplatzes auf iOS setzen (Cmd-Opt-0) oder stattdessen UIKit importieren, wie oben erwähnt
Chris Conover
1
Kein solches Modul 'Kakao'
Alexander Volkov
4
UIKit, Cocoa, Foundation, alle gültigen Entscheidungen.
Erdekhayser
Das Importieren von Kakao funktioniert in iOS-Anwendungen nicht. Der Fehler "Kein solches Modul 'Cocoa' tritt auf. Wenn Sie nur UIKit importieren, wird eine Fehlermeldung bei der Verwendung von sqrt ()
angezeigt
77

Um genau zu sein, ist Darwin genug. Es ist nicht erforderlich, das gesamte Cocoa-Framework zu importieren.

import Darwin

Wenn Sie Elemente aus Cocoa oder Foundation oder anderen übergeordneten Frameworks benötigen, können Sie diese natürlich importieren

bpresles
quelle
Und mit Swift 3+, Sie Darwin nicht benötigen (oder Glibc) für sqrt, floorund roundweil Sie nativ bzw. verwenden können 0.5.squareRoot(), Int(0.5)und 0.5.round().
Cœur
17

Für Leute, die swift [2.2] unter Linux, dh Ubuntu, verwenden, ist der Import anders!

Der richtige Weg, dies zu tun, ist die Verwendung von Glibc. Dies liegt daran, dass sich unter OS X und iOS die grundlegenden Unix-ähnlichen APIs in Darwin befinden, unter Linux jedoch in Glibc. Das Importieren von Foundation hilft Ihnen hier nicht weiter, da es nicht von selbst unterscheidet. Dazu müssen Sie es explizit selbst importieren:

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

Sie können die Entwicklung des Foundation Frameworks hier verfolgen , um mehr zu erfahren


EDIT: 26. Dezember 2018

Wie wies darauf hin , durch @ Cœur , von einer schnellen 3.0 sind einige mathematische Funktionen beginnen jetzt Teil der Typen selbst. Zum Beispiel hat Double jetzt eine squareRoot- Funktion. In ähnlicher Weise ceil, floor, roundkönnen alle mit erreicht werden Double.rounded(FloatingPointRoundingRule) -> Double.

Außerdem habe ich gerade die neueste stabile Version von swift unter Ubuntu 18.04 heruntergeladen und installiert, und es sieht so aus, als ob Sie nur das FoundationFramework importieren müssen, um auf die mathematischen Funktionen zugreifen zu können. Ich habe versucht, eine Dokumentation dafür zu finden, aber es kam nichts heraus.

➜ 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
quelle
Und mit Swift 3+, Sie Darwin nicht benötigen (oder Glibc) für sqrt, floorund roundweil Sie nativ bzw. verwenden können 0.5.squareRoot(), Int(0.5)und 0.5.round().
Cœur
@ Cœur, ich bin seit einer Weile nicht mehr mit Swift in Kontakt. Vielleicht können Sie diesen Einblick in Form einer Antwort anbieten. Danke
smac89
Dafür musste powich Glibcfür Linux einbinden, danke!
A1rPun
10

Sie können sie direkt inline verwenden:

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
quelle
1
Ich erhalte die folgende Fehlermeldung: Verwendung des ungelösten Bezeichners 'sqrt'.
Giovanni
Ich denke, es erwartet von mir, dass ich eine Funktion namens sqrt deklariere, aber offensichtlich ist es nicht das, was ich will. Vielen Dank
Giovanni
Sie müssen UIKit, Cocoa oder Foundation importieren.
Ben Gottlieb
Gibt es eine Funktion, bei der ich ihr ein Array von Ints geben kann, und Swift würde mir dann eine Potenzfunktion von 2 (oder 1 oder 3 oder was auch immer) zurückgeben, die am besten dazu passt? wie ich es gebe: [1,2,3]es würde zurückkehren y = xoder ich würde es geben [1,4,9] es würde zurückkehren y = x^2oder etwas in der Nähe von sof(x)
Honey
Es funktioniert für mich, aber mein Spielplatz importiert standardmäßig UIKit. Und es funktioniert auch, wenn Foundation oder Darwin anstelle von UIKit importiert werden.
Timbergus
8

Um die mathematischen Funktionen nutzen zu können, müssen Sie import Cocoa

Sie können die anderen definierten mathematischen Funktionen folgendermaßen sehen. Machen Sie einen Cmd-Klick auf den Funktionsnamen sqrtund Sie geben die Datei mit allen anderen globalen mathematischen Funktionen und Konstanten ein.

Ein kleiner Ausschnitt aus der Datei

...
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
quelle
1
Nun, es ist eine Antwort auf die eigentliche Frage "Wie verwende ich mathematische Funktionen wie sqrt (), floor (), round (), sin () usw.?"
DanEEStar
2
Es ist keine richtige Antwort. Sie sind keine globalen Funktionen. Sie müssen import Cocoasie verwenden.
James Billingham
3

Für die Swift-Vorgehensweise können Sie versuchen, die in der Swift Standard Library verfügbaren Tools zu verwenden. Diese sollten auf jeder Plattform funktionieren, auf der Swift ausgeführt werden kann.

Statt floor(), round()und der Rest der Runden - Routinen können Sie verwenden 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"

Diese sind derzeit auf Floatund Doublees sollte einen leicht genug , um zu konvertieren sein CGFloatzum Beispiel.

Stattdessen sqrt()gibt es die squareRoot()Methode für das FloatingPoint-Protokoll. Wieder beide Floatund Doubleentsprechen dem FloatingPointProtokoll:

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

Für die trigonometrischen Funktionen kann die Standardbibliothek nicht helfen. Importieren Sie Darwin am besten auf den Apple-Plattformen oder Glibc unter Linux. Mit gekreuzten Fingern werden sie in Zukunft ordentlicher sein.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Tricky
quelle