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”
Ambiguous reference to x
sprawdź tę odpowiedź: stackoverflow.com/a/34357943/1359306Odpowiedzi:
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).
źródło
No such module 'Cocoa'
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ć
źródło
sqrt
,floor
around
ponieważ można użyć odpowiednio natywnie0.5.squareRoot()
,Int(0.5)
a0.5.round()
.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
,round
moż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
Foundation
framework 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
źródło
sqrt
,floor
around
ponieważ można użyć odpowiednio natywnie0.5.squareRoot()
,Int(0.5)
a0.5.round()
.pow
musiałem dołączyćGlibc
do systemu Linux, dzięki!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)")
źródło
[1,2,3]
wróciy = x
lub dałbym temu [1,4,9] to wróciy = x^2
lub coś po prostu zamknie się w ten sposóbf(x)
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ę funkcji
sqrt
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) */ ...
źródło
import Cocoa
ich użyć.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
Float
iDouble
powinny być łatwe do konwersjiCGFloat
na przykład na.Zamiast tego
sqrt()
istniejesquareRoot()
metoda w protokole FloatingPoint. Ponownie, obaFloat
iDouble
zgodne zFloatingPoint
protokoł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"
źródło