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


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


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ć


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

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

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

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.