Funkcje matematyczne w Swift

95

Jak używać funkcji matematycznych, takich jak sqrt(), floor(), round(), sin(), etc?


Robiąc:

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

Dostaję:

błąd: użycie nierozwiązanego identyfikatora „podłoga”
błąd: użycie nierozwiązanego identyfikatora „sqrt”

wprowadź opis obrazu tutaj

Giovanni
źródło
Jeśli otrzymasz odpowiedź, Ambiguous reference to xsprawdź tę odpowiedź: stackoverflow.com/a/34357943/1359306
Patrick

Odpowiedzi:

98

Jak zauważyli inni, masz kilka opcji. Jeśli chcesz tylko funkcje matematyczne. Możesz importować tylko Darwina.

import Darwin

Jeśli potrzebujesz funkcji matematycznych i innych standardowych klas i funkcji. Możesz zaimportować Foundation.

import Foundation

Jeśli chcesz wszystkiego, a także klas dla interfejsu użytkownika, zależy to od tego, czy Twój plac zabaw jest na OS X czy iOS.

W przypadku OS X musisz importować kakao.

import Cocoa

W przypadku iOS musisz importować UIKit.

import UIKit

Możesz łatwo odkryć swoją platformę zabaw, otwierając Inspektor plików (⌥⌘1).

Ustawienia placu zabaw - platforma

Tomáš Linhart
źródło
6
Na placu zabaw Swift No such module 'Cocoa'
pojawia się
@noilly: już trochę późno, musisz ustawić typ pliku na iOS we właściwościach pliku Playground (Cmd-Opt-0) lub zamiast tego zaimportować UIKit, zgodnie z powyższym komentarzem
Chris Conover
1
Nie ma takiego modułu „Cocoa”
Alexander Volkov
4
UIKit, Cocoa, Foundation, wszystkie ważne wybory.
erdekhayser
Importowanie Cocoa nie działa w aplikacjach na iOS. Pojawia się błąd „Nie ma takiego modułu„ Cocoa ”. Jeśli po prostu zaimportujesz UIKit, pojawi się błąd podczas używania sqrt ().
SomeGuy
77

Aby być doskonale precyzyjnym, Darwin wystarczy. Nie ma potrzeby importowania całego frameworka Cocoa.

import Darwin

Oczywiście, jeśli potrzebujesz elementów z Cocoa, Foundation lub innych frameworków wyższego poziomu, możesz je zamiast tego zaimportować

bpresles
źródło
Iz Swift 3+, nie trzeba Darwin (lub) dla Glibc sqrt, floora roundponieważ można użyć odpowiednio natywnie 0.5.squareRoot(), Int(0.5)a 0.5.round().
Cœur
17

Dla osób używających swift [2.2] na Linuksie, tj. Ubuntu, import jest inny!

Prawidłowym sposobem na to jest użycie Glibc. Dzieje się tak, ponieważ na OS X i iOS podstawowe API podobne do Unix znajdują się w Darwinie, ale w Linuksie znajdują się w Glibc. Importing Foundation ci tutaj nie pomoże, ponieważ sama nie robi tego rozróżnienia. Aby to zrobić, musisz jawnie zaimportować go samodzielnie:

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

Możesz śledzić rozwój frameworka Foundation tutaj, aby dowiedzieć się więcej


EDYCJA: 26 grudnia 2018

Jak wskazał przez @ Coeur , począwszy od szybkich 3.0 niektóre funkcje matematyczne są teraz częścią samych typów. Na przykład Double ma teraz squareRoot . Podobnie ceil, floor, roundmoże być w całości osiągnąć Double.rounded(FloatingPointRoundingRule) -> Double.

Co więcej, właśnie pobrałem i zainstalowałem najnowszą stabilną wersję Swift na Ubuntu 18.04 i wygląda na to, że Foundationframework to wszystko, czego potrzebujesz do zaimportowania, aby mieć teraz dostęp do funkcji matematycznych. Próbowałem znaleźć odpowiednią dokumentację, ale nic nie wyszło.

➜ 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
źródło
Iz Swift 3+, nie trzeba Darwin (lub) dla Glibc sqrt, floora roundponieważ można użyć odpowiednio natywnie 0.5.squareRoot(), Int(0.5)a 0.5.round().
Cœur
@ Cœur, od jakiegoś czasu straciłem kontakt z szybką. Być może możesz zaoferować ten wgląd w formie odpowiedzi. Dzięki
smac89
Ponieważ powmusiałem dołączyć Glibcdo systemu Linux, dzięki!
A1rPun
10

Możesz ich używać bezpośrednio w tekście:

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
źródło
1
Pojawia się następujący błąd: użycie nierozwiązanego identyfikatora „sqrt”.
Giovanni
Myślę, że oczekuje, że zadeklaruję funkcję o nazwie sqrt, ale oczywiście nie tego chcę. Dzięki
Giovanni
Musisz zaimportować UIKit, Cocoa lub Foundation.
Ben Gottlieb
Czy jest funkcja, w której mogę podać jej tablicę Ints, a następnie Swift zwróci mi funkcję o potędze 2 (lub 1, 3 lub cokolwiek), która najlepiej do niej pasuje? tak, jak to daję: [1,2,3]wróci y = xlub dałbym temu [1,4,9] to wróci y = x^2lub coś po prostu zamknie się w ten sposóbf(x)
Kochanie,
U mnie to działa, ale mój plac zabaw domyślnie importuje UIKit. I to też działa, importując Foundation lub Darwin zamiast UIKit.
Timbergus,
8

Aby korzystać z funkcji matematycznych, musisz import Cocoa

Możesz zobaczyć inne zdefiniowane funkcje matematyczne w następujący sposób. Wykonaj Cmd-Kliknij nazwę funkcjisqrt i wejdź do pliku ze wszystkimi innymi globalnymi funkcjami matematycznymi i stałymi.

Mały fragment pliku

...
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
źródło
1
Cóż, jest to odpowiedź na rzeczywiste pytanie „Jak używać funkcji matematycznych, takich jak sqrt (), floor (), round (), sin () itp.?”
DanEEStar
2
To nie jest poprawna odpowiedź. Nie są to funkcje globalne. Musisz import Cocoaich użyć.
James Billingham
3

Aby działać w trybie Swift, możesz spróbować skorzystać z narzędzi dostępnych w bibliotece Swift Standard Library. Powinny one działać na każdej platformie, na której można uruchomić Swift.

Zamiast floor(), round()a reszta zaokrąglenia procedury można użyć 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"

Są one obecnie dostępne na Floati Doublepowinny być łatwe do konwersji CGFloatna przykład na.

Zamiast tego sqrt()istnieje squareRoot()metoda w protokole FloatingPoint. Ponownie, oba Floati Doublezgodne z FloatingPointprotokołem:

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

W przypadku funkcji trygonometrycznych standardowa biblioteka nie może pomóc, więc najlepiej importuj Darwina na platformy Apple lub Glibc w systemie Linux. Trzymamy kciuki, że w przyszłości będą bardziej schludne.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Zdradliwy
źródło