Fungsi matematika di Swift

95

Bagaimana cara menggunakan fungsi matematika seperti sqrt(), floor(), round(), sin(), dll?


Saat melakukan:

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

Saya mendapat:

kesalahan: penggunaan pengenal yang tidak terselesaikan
kesalahan 'lantai' : penggunaan pengenal yang tidak terselesaikan 'sqrt'

masukkan deskripsi gambar di sini

Giovanni
sumber
Jika Anda mendapatkan Ambiguous reference to xjawabannya , periksa ini: stackoverflow.com/a/34357943/1359306
Patrick

Jawaban:

98

Seperti yang dicatat lain, Anda memiliki beberapa opsi. Jika Anda hanya menginginkan fungsi matematika. Anda hanya dapat mengimpor Darwin.

import Darwin

Jika Anda menginginkan fungsi matematika dan kelas dan fungsi standar lainnya. Anda dapat mengimpor Foundation.

import Foundation

Jika Anda menginginkan segalanya dan juga kelas untuk antarmuka pengguna, itu tergantung apakah taman bermain Anda untuk OS X atau iOS.

Untuk OS X, Anda perlu mengimpor Cocoa.

import Cocoa

Untuk iOS, Anda perlu mengimpor UIKit.

import UIKit

Anda dapat dengan mudah menemukan platform taman bermain Anda dengan membuka File Inspector (⌥⌘1).

Pengaturan Playground - Platform

Tomáš Linhart
sumber
6
Di taman bermain Swift, saya mendapatkan kesalahan:No such module 'Cocoa'
David Poxon
@noilly: agak terlambat sekarang, Anda harus menyetel jenis file ke iOS di properti file Playground (Cmd-Opt-0), atau mengimpor UIKit sebagai gantinya, sesuai komentar di atas
Chris Conover
1
Tidak ada modul seperti 'Kakao'
Alexander Volkov
4
UIKit, Cocoa, Foundation, semua pilihan yang valid.
erdekhayser
Mengimpor Kakao tidak berfungsi di aplikasi iOS. Kesalahan "Tidak ada modul 'Kakao' yang muncul. Jika Anda baru saja mengimpor UIKit, Anda akan mendapatkan kesalahan saat menggunakan sqrt ().
SomeGuy
77

Tepatnya, Darwin sudah cukup. Tidak perlu mengimpor keseluruhan kerangka Kakao.

import Darwin

Tentu saja, jika Anda membutuhkan elemen dari Cocoa atau Foundation atau kerangka kerja tingkat yang lebih tinggi, Anda dapat mengimpornya

bpresles
sumber
Dan dengan Swift 3+, Anda tidak memerlukan Darwin (atau Glibc) untuk sqrt, floordan roundkarena Anda mungkin menggunakan aslinya 0.5.squareRoot(), Int(0.5)dan 0.5.round().
Cœur
17

Bagi orang yang menggunakan swift [2.2] di Linux misalnya Ubuntu, impornya berbeda!

Cara yang benar untuk melakukannya adalah dengan menggunakan Glibc. Ini karena di OS X dan iOS, API dasar mirip Unix ada di Darwin tetapi di linux, ini ada di Glibc. Importing Foundation tidak akan membantu Anda di sini karena tidak membuat perbedaan dengan sendirinya. Untuk melakukan ini, Anda harus mengimpornya sendiri secara eksplisit:

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

Anda dapat mengikuti perkembangan kerangka Foundation sini untuk mempelajari lebih lanjut


EDIT: 26 Desember 2018

Seperti yang ditunjukkan oleh @ Cœur , mulai dari swift 3.0 beberapa fungsi matematika sekarang menjadi bagian dari jenis itu sendiri. Misalnya, Double sekarang memiliki fungsi squareRoot . Demikian pula, ceil, floor, round, semua bisa dicapai denganDouble.rounded(FloatingPointRoundingRule) -> Double .

Selain itu, saya baru saja mengunduh dan menginstal swift versi stabil terbaru di Ubuntu 18.04, dan sepertinya hanya Foundationkerangka kerja yang perlu Anda impor untuk memiliki akses ke fungsi matematika sekarang. Saya mencoba mencari dokumentasi untuk ini, tetapi tidak ada yang muncul.

➜ 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
sumber
Dan dengan Swift 3+, Anda tidak memerlukan Darwin (atau Glibc) untuk sqrt, floordan roundkarena Anda mungkin menggunakan aslinya 0.5.squareRoot(), Int(0.5)dan 0.5.round().
Cœur
@ Cœur, saya sudah tidak berhubungan dengan cepat untuk sementara waktu. Mungkin Anda bisa menawarkan wawasan ini dalam bentuk jawaban. Terima kasih
smac89
Karena powsaya perlu menyertakan Glibcuntuk Linux, terima kasih!
A1rPun
10

Anda dapat menggunakannya secara langsung:

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
sumber
1
Saya mendapatkan kesalahan berikut: penggunaan pengenal 'sqrt' yang belum terselesaikan.
Giovanni
Saya pikir itu mengharapkan saya untuk mendeklarasikan fungsi yang disebut sqrt, tetapi jelas itu bukan yang saya inginkan. Terima kasih
Giovanni
Anda perlu mengimpor UIKit, atau Cocoa, atau Foundation.
Ben Gottlieb
apakah ada fungsi di mana saya bisa memberikan array Ints dan kemudian Swift akan mengembalikan saya fungsi kekuatan 2 (atau 1, atau 3, atau apa pun) yang paling cocok? seperti yang saya berikan: [1,2,3]itu akan kembali y = xatau saya akan memberikannya [1,4,9] itu akan kembali y = x^2atau mendekati seperti ituf(x)
Madu
Ini berfungsi untuk saya, tetapi taman bermain saya mengimpor UIKit secara default. Dan berhasil juga, mengimpor Foundation atau Darwin sebagai gantinya UIKit.
Timbergus
8

Untuk menggunakan fungsi matematika, Anda harus melakukannya import Cocoa

Anda dapat melihat fungsi matematika lain yang ditentukan dengan cara berikut. Buat Cmd-Klik pada nama fungsisqrt dan Anda memasukkan file dengan semua fungsi dan konstanta matematika global lainnya.

Potongan kecil 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)        */
...
DanEEStar
sumber
1
Ini adalah jawaban dari pertanyaan sebenarnya "Bagaimana cara menggunakan fungsi matematika seperti sqrt (), floor (), round (), sin (), dll?"
DanEEStar
2
Itu bukanlah jawaban yang benar. Itu bukanlah fungsi global. Anda harus import Cocoamenggunakannya.
James Billingham
3

Untuk cara Swift dalam melakukan sesuatu, Anda dapat mencoba dan menggunakan alat yang tersedia di Perpustakaan Standar Swift. Ini harus berfungsi pada platform apa pun yang dapat menjalankan Swift.

Alih-alih floor(), round()dan rutinitas pembulatan lainnya, Anda dapat menggunakan 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"

Ini saat ini tersedia di Floatdan Doubledan seharusnya cukup mudah untuk diubah menjadi fileCGFloat contoh.

Alih-alih sqrt()ada squareRoot()metode pada protokol FloatingPoint. Sekali lagi, keduanya Floatdan Doublesesuai dengan FloatingPointprotokol:

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

Untuk fungsi trigonometri, pustaka standar tidak dapat membantu, jadi sebaiknya Anda mengimpor Darwin di platform Apple atau Glibc di Linux. Semoga saja mereka akan menjadi cara yang lebih rapi di masa depan.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Rumit
sumber