ฟังก์ชันทางคณิตศาสตร์ใน Swift


96

ฉันจะใช้ฟังก์ชั่นทางคณิตศาสตร์เช่นวิธีsqrt(), floor(), round(), sin()etc?


เมื่อทำ:

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

ฉันเข้าใจ:

ข้อผิดพลาด: การใช้ข้อผิดพลาด 'floor' ตัวระบุที่ไม่ได้รับการแก้ไข
: การใช้ตัวระบุที่ไม่ได้รับการแก้ไข 'sqrt'

ป้อนคำอธิบายภาพที่นี่


หากคุณได้Ambiguous reference to xรับคำตอบนี้: stackoverflow.com/a/34357943/1359306
Patrick

คำตอบ:


99

ตามที่ระบุไว้คุณมีหลายทางเลือก หากคุณต้องการเพียงฟังก์ชันทางคณิตศาสตร์ คุณสามารถนำเข้าได้เฉพาะดาร์วิน

import Darwin

หากคุณต้องการฟังก์ชันทางคณิตศาสตร์และคลาสและฟังก์ชันมาตรฐานอื่น ๆ คุณสามารถนำเข้า Foundation

import Foundation

หากคุณต้องการทุกอย่างและยังมีคลาสสำหรับอินเทอร์เฟซผู้ใช้ขึ้นอยู่กับว่า Playground ของคุณใช้สำหรับ OS X หรือ iOS

สำหรับ OS X คุณต้องนำเข้าโกโก้

import Cocoa

สำหรับ iOS คุณต้องนำเข้า UIKit

import UIKit

คุณสามารถค้นพบแพลตฟอร์มสนามเด็กเล่นของคุณได้อย่างง่ายดายโดยเปิด File Inspector (⌥⌘1)

การตั้งค่าสนามเด็กเล่น - แพลตฟอร์ม


6
ในสนามเด็กเล่น Swift ฉันได้รับข้อผิดพลาด:No such module 'Cocoa'
David Poxon

@noilly: ตอนนี้คุณต้องตั้งค่าประเภทไฟล์เป็น iOS ในคุณสมบัติไฟล์ของ Playground (Cmd-Opt-0) หรือนำเข้า UIKit แทนตามความคิดเห็นด้านบน
Chris Conover

1
ไม่มีโมดูลดังกล่าว 'Cocoa'
Alexander Volkov

4
UIKit โกโก้รองพื้นตัวเลือกที่ถูกต้องทั้งหมด
erdekhayser

การนำเข้าโกโก้ไม่ทำงานในแอปพลิเคชัน iOS เกิดข้อผิดพลาด "No such module" Cocoa "หากคุณเพิ่งนำเข้า UIKit คุณจะได้รับข้อผิดพลาดในการใช้ sqrt ()
SomeGuy

77

เพื่อความแม่นยำอย่างสมบูรณ์แบบดาร์วินก็เพียงพอแล้ว ไม่ต้องนำเข้า Cocoa ทั้งกรอบ

import Darwin

แน่นอนว่าหากคุณต้องการองค์ประกอบจาก Cocoa หรือ Foundation หรือเฟรมเวิร์กระดับสูงกว่าอื่น ๆ คุณสามารถนำเข้ามาแทนได้


และมีสวิฟท์ 3+, คุณไม่จำเป็นต้องดาร์วิน (หรือ Glibc) สำหรับsqrt, floorและroundเพราะคุณกำเนิดอาจจะใช้ตามลำดับ0.5.squareRoot(),Int(0.5)0.5.round()และ
Cœur

17

สำหรับคนที่ใช้ swift [2.2] บน Linux เช่น Ubuntu การนำเข้าจะแตกต่างกัน!

วิธีที่ถูกต้องคือใช้ Glibc เนื่องจากใน OS X และ iOS API พื้นฐานคล้าย Unix อยู่ในดาร์วิน แต่ใน linux ซึ่งอยู่ใน Glibc Importing Foundation จะไม่ช่วยคุณตรงนี้เพราะมันไม่ได้สร้างความแตกต่างด้วยตัวมันเอง ในการดำเนินการนี้คุณต้องนำเข้าด้วยตนเองอย่างชัดเจน:

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

คุณสามารถติดตามการพัฒนากรอบของมูลนิธิได้ที่นี่เพื่อเรียนรู้เพิ่มเติม


แก้ไข: 26 ธันวาคม 2561

ตามที่ระบุไว้โดย@ Cœurเริ่มต้นจากการที่รวดเร็ว 3.0 บางฟังก์ชั่นทางคณิตศาสตร์ในขณะนี้เป็นส่วนหนึ่งของประเภทของตัวเอง ตัวอย่างเช่นตอนนี้Doubleมีฟังก์ชันsquareRoot ในทำนองเดียวกันceil, floor, round, Double.rounded(FloatingPointRoundingRule) -> Doubleทั้งหมดจะสามารถประสบความสำเร็จกับ

นอกจากนี้ฉันเพิ่งดาวน์โหลดและติดตั้ง swift เวอร์ชันเสถียรล่าสุดบน Ubuntu 18.04 และดูเหมือนว่า Foundationเฟรมเวิร์กเป็นสิ่งที่คุณต้องนำเข้าเพื่อให้สามารถเข้าถึงฟังก์ชันคณิตศาสตร์ได้ในขณะนี้ ฉันพยายามค้นหาเอกสารสำหรับสิ่งนี้ แต่ไม่มีอะไรเกิดขึ้น

➜ 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

และมีสวิฟท์ 3+, คุณไม่จำเป็นต้องดาร์วิน (หรือ Glibc) สำหรับsqrt, floorและroundเพราะคุณกำเนิดอาจจะใช้ตามลำดับ0.5.squareRoot(), และInt(0.5) 0.5.round()
Cœur

@ Cœurฉันไม่ได้สัมผัสกับความรวดเร็วมาระยะหนึ่งแล้ว บางทีคุณอาจเสนอข้อมูลเชิงลึกนี้ในรูปแบบของคำตอบ ขอบคุณ
smac89

สำหรับpowฉันต้องการรวมGlibcสำหรับ Linux ขอบคุณ!
A1rPun

10

คุณสามารถใช้มันได้แบบอินไลน์:

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
ฉันได้รับข้อผิดพลาดต่อไปนี้: การใช้ตัวระบุที่ไม่ได้รับการแก้ไข 'sqrt'
Giovanni

ฉันคิดว่ามันคาดหวังให้ฉันประกาศฟังก์ชันที่เรียกว่า sqrt แต่เห็นได้ชัดว่ามันไม่ใช่สิ่งที่ฉันต้องการ ขอบคุณ
Giovanni

คุณต้องนำเข้า UIKit หรือ Cocoa หรือ Foundation
Ben Gottlieb

มีฟังก์ชันใดบ้างที่ฉันสามารถให้ Ints อาร์เรย์ได้จากนั้น Swift จะส่งคืนฟังก์ชันของพลัง 2 (หรือ 1 หรือ 3 หรืออะไรก็ได้) ที่ตรงกับมันมากที่สุด เหมือนฉันให้มัน[1,2,3]มันก็จะกลับมาy = xหรือฉันจะให้มัน [1,4,9] มันจะกลับมาy = x^2หรือสิ่งที่อยู่ใกล้ในลักษณะของการที่f(x)
น้ำผึ้ง

มันใช้งานได้สำหรับฉัน แต่สนามเด็กเล่นของฉันจะนำเข้า UIKit โดยค่าเริ่มต้น และได้ผลเช่นกันโดยนำเข้า Foundation หรือ Darwin แทน UIKit
Timbergus

8

ในการใช้ฟังก์ชันทางคณิตศาสตร์ที่คุณต้องทำ import Cocoa

คุณสามารถดูฟังก์ชันทางคณิตศาสตร์อื่น ๆ ที่กำหนดได้ดังต่อไปนี้ สร้าง Cmd-Click ที่ชื่อฟังก์ชันsqrtและคุณป้อนไฟล์ด้วยฟังก์ชันคณิตศาสตร์ส่วนกลางอื่น ๆ และค่าคงที่

ข้อมูลโค้ดขนาดเล็กของไฟล์

...
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
มันเป็นคำตอบสำหรับคำถามจริง "ฉันจะใช้ฟังก์ชันทางคณิตศาสตร์เช่น sqrt (), floor (), round (), sin () ฯลฯ ได้อย่างไร?
DanEEStar

2
มันไม่ใช่คำตอบที่ถูกต้อง ไม่ใช่ฟังก์ชันส่วนกลาง คุณต้องimport Cocoaใช้พวกเขา
James Billingham

3

สำหรับวิธีทำสิ่งต่างๆอย่างรวดเร็วคุณสามารถลองใช้เครื่องมือที่มีอยู่ในไลบรารีมาตรฐานของ Swift สิ่งเหล่านี้ควรทำงานบนแพลตฟอร์มใดก็ได้ที่สามารถเรียกใช้ Swift ได้

แทนที่จะfloor(), round()และส่วนที่เหลือของขั้นตอนการปัดเศษคุณสามารถใช้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"

สิ่งเหล่านี้มีให้บริการในปัจจุบันFloatและDoubleควรจะง่ายพอที่จะแปลงเป็นไฟล์CGFloatตัวอย่าง

แทนที่จะsqrt()มีsquareRoot()วิธีการในโปรโตคอล FloatingPoint อีกครั้งทั้งสองFloatและDoubleสอดคล้องกับFloatingPointโปรโตคอล:

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

สำหรับฟังก์ชันตรีโกณมิติไลบรารีมาตรฐานไม่สามารถช่วยได้ดังนั้นคุณควรนำเข้าดาร์วินบนแพลตฟอร์มของ Apple หรือ Glibc บน Linux ข้ามนิ้วพวกเขาจะเป็นวิธีที่ดีกว่าในอนาคต

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.