ฉันจะใช้ฟังก์ชั่นทางคณิตศาสตร์เช่นวิธีsqrt()
, floor()
, round()
, sin()
etc?
เมื่อทำ:
_ = floor(2.0)
_ = sqrt(2.0)
ฉันเข้าใจ:
ข้อผิดพลาด: การใช้ข้อผิดพลาด 'floor' ตัวระบุที่ไม่ได้รับการแก้ไข
: การใช้ตัวระบุที่ไม่ได้รับการแก้ไข 'sqrt'
ฉันจะใช้ฟังก์ชั่นทางคณิตศาสตร์เช่นวิธีsqrt()
, floor()
, round()
, sin()
etc?
เมื่อทำ:
_ = floor(2.0)
_ = sqrt(2.0)
ฉันเข้าใจ:
ข้อผิดพลาด: การใช้ข้อผิดพลาด 'floor' ตัวระบุที่ไม่ได้รับการแก้ไข
: การใช้ตัวระบุที่ไม่ได้รับการแก้ไข 'sqrt'
คำตอบ:
ตามที่ระบุไว้คุณมีหลายทางเลือก หากคุณต้องการเพียงฟังก์ชันทางคณิตศาสตร์ คุณสามารถนำเข้าได้เฉพาะดาร์วิน
import Darwin
หากคุณต้องการฟังก์ชันทางคณิตศาสตร์และคลาสและฟังก์ชันมาตรฐานอื่น ๆ คุณสามารถนำเข้า Foundation
import Foundation
หากคุณต้องการทุกอย่างและยังมีคลาสสำหรับอินเทอร์เฟซผู้ใช้ขึ้นอยู่กับว่า Playground ของคุณใช้สำหรับ OS X หรือ iOS
สำหรับ OS X คุณต้องนำเข้าโกโก้
import Cocoa
สำหรับ iOS คุณต้องนำเข้า UIKit
import UIKit
คุณสามารถค้นพบแพลตฟอร์มสนามเด็กเล่นของคุณได้อย่างง่ายดายโดยเปิด File Inspector (⌥⌘1)
No such module 'Cocoa'
เพื่อความแม่นยำอย่างสมบูรณ์แบบดาร์วินก็เพียงพอแล้ว ไม่ต้องนำเข้า Cocoa ทั้งกรอบ
import Darwin
แน่นอนว่าหากคุณต้องการองค์ประกอบจาก Cocoa หรือ Foundation หรือเฟรมเวิร์กระดับสูงกว่าอื่น ๆ คุณสามารถนำเข้ามาแทนได้
sqrt
, floor
และround
เพราะคุณกำเนิดอาจจะใช้ตามลำดับ0.5.squareRoot()
,Int(0.5)
0.5.round()
และ
สำหรับคนที่ใช้ 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
คุณสามารถติดตามการพัฒนากรอบของมูลนิธิได้ที่นี่เพื่อเรียนรู้เพิ่มเติม
ตามที่ระบุไว้โดย@ 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
sqrt
, floor
และround
เพราะคุณกำเนิดอาจจะใช้ตามลำดับ0.5.squareRoot()
, และInt(0.5)
0.5.round()
pow
ฉันต้องการรวมGlibc
สำหรับ Linux ขอบคุณ!
คุณสามารถใช้มันได้แบบอินไลน์:
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,2,3]
มันก็จะกลับมาy = x
หรือฉันจะให้มัน [1,4,9] มันจะกลับมาy = x^2
หรือสิ่งที่อยู่ใกล้ในลักษณะของการที่f(x)
ในการใช้ฟังก์ชันทางคณิตศาสตร์ที่คุณต้องทำ 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) */
...
import Cocoa
ใช้พวกเขา
สำหรับวิธีทำสิ่งต่างๆอย่างรวดเร็วคุณสามารถลองใช้เครื่องมือที่มีอยู่ในไลบรารีมาตรฐานของ 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"
Ambiguous reference to x
รับคำตอบนี้: stackoverflow.com/a/34357943/1359306