Các hàm toán học trong Swift


95

Làm thế nào để sử dụng chức năng toán học như sqrt(), floor(), round(), sin(), vv?


Khi làm:

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

Tôi có:

error: sử dụng số nhận dạng chưa được giải quyết.
Lỗi 'sàn' : sử dụng số nhận dạng chưa được giải quyết 'sqrt'

nhập mô tả hình ảnh ở đây


Nếu bạn nhận được Ambiguous reference to xkiểm tra câu trả lời này ra: stackoverflow.com/a/34357943/1359306
Patrick

Câu trả lời:


98

Như đã lưu ý khác, bạn có một số tùy chọn. Nếu bạn chỉ muốn các hàm toán học. Bạn chỉ có thể nhập Darwin.

import Darwin

Nếu bạn muốn các hàm toán học và các lớp và hàm tiêu chuẩn khác. Bạn có thể nhập Foundation.

import Foundation

Nếu bạn muốn mọi thứ và cả các lớp cho giao diện người dùng, điều đó phụ thuộc vào sân chơi của bạn dành cho OS X hay iOS.

Đối với OS X, bạn cần nhập Cacao.

import Cocoa

Đối với iOS, bạn cần nhập UIKit.

import UIKit

Bạn có thể dễ dàng khám phá nền tảng sân chơi của mình bằng cách mở Trình kiểm tra tệp (⌥⌘1).

Cài đặt sân chơi - Nền tảng


6
Trong sân chơi Swift, tôi nhận được lỗi:No such module 'Cocoa'
David Poxon

@noilly: khá muộn bây giờ, bạn phải thiết lập các loại tập tin lên iOS trong thuộc tính của tập tin Playground (Cmd-Opt-0), hoặc nhập khẩu UIKit thay vào đó, mỗi bình luận trên
Chris Conover

1
Không có mô-đun nào như vậy 'Ca cao'
Alexander Volkov

4
UIKit, Cocoa, Foundation, tất cả các lựa chọn hợp lệ.
erdekhayser

Nhập Cacao không hoạt động trong các ứng dụng iOS. Lỗi "Không có mô-đun như vậy 'Cocoa' phát sinh. Nếu bạn chỉ nhập UIKit, bạn sẽ gặp lỗi khi sử dụng sqrt ().
SomeGuy

77

Nói chính xác một cách hoàn hảo, Darwin là đủ. Không cần nhập toàn bộ khuôn khổ Cacao.

import Darwin

Tất nhiên, nếu bạn cần các phần tử từ Cacao hoặc Foundation hoặc các khuôn khổ cấp cao khác, bạn có thể nhập chúng để thay thế


Và với Swift 3+, bạn không cần Darwin (hoặc Glibc) cho sqrt, floorroundbởi vì bạn có thể sử dụng nguyên bản tương ứng 0.5.squareRoot(), Int(0.5)0.5.round().
Cœur

17

Đối với những người sử dụng swift [2.2] trên Linux tức là Ubuntu, việc nhập là khác nhau!

Cách chính xác để làm điều này là sử dụng Glibc. Điều này là do trên OS X và iOS, các API cơ bản giống Unix nằm trong Darwin nhưng trong linux, các API này nằm trong Glibc. Quỹ nhập khẩu sẽ không giúp bạn ở đây vì bản thân nó không tạo ra sự khác biệt. Để làm điều này, bạn phải tự nhập rõ ràng:

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

Bạn có thể theo dõi sự phát triển của khuôn khổ Foundation tại đây để tìm hiểu thêm


CHỈNH SỬA: ngày 26 tháng 12 năm 2018

Như đã chỉ ra bởi @ Cœur , bắt đầu từ phiên bản nhanh 3.0, một số hàm toán học giờ đây đã trở thành một phần của chính các loại này. Ví dụ, Double bây giờ có một chức năng squareRoot . Tương tự như vậy, ceil, floor, round, đều có thể được thực hiện với Double.rounded(FloatingPointRoundingRule) -> Double.

Hơn nữa, tôi vừa tải xuống và cài đặt phiên bản swift ổn định mới nhất trên Ubuntu 18.04 và có vẻ như Foundationframework là tất cả những gì bạn cần nhập để có quyền truy cập vào các hàm toán học ngay bây giờ. Tôi đã thử tìm tài liệu cho việc này, nhưng không có gì xuất hiện.

➜ 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

Và với Swift 3+, bạn không cần Darwin (hoặc Glibc) cho sqrt, floorroundbởi vì bạn có thể sử dụng nguyên bản tương ứng 0.5.squareRoot(), Int(0.5)0.5.round().
Cœur

@ Xin chào, tôi đã mất liên lạc với nhanh chóng một thời gian. Có lẽ bạn có thể đưa ra cái nhìn sâu sắc này dưới dạng một câu trả lời. Cảm ơn
smac89

powtôi cần đưa Glibcvào Linux, cảm ơn!
A1rPun

10

Bạn có thể sử dụng chúng ngay trong dòng:

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
Tôi gặp lỗi sau: sử dụng số nhận dạng chưa được giải quyết 'sqrt'.
Giovanni

Tôi nghĩ rằng nó đang mong đợi tôi khai báo một hàm được gọi là sqrt, nhưng rõ ràng đó không phải là những gì tôi muốn. Cảm ơn
Giovanni

Bạn cần nhập UIKit hoặc Cocoa hoặc Foundation.
Ben Gottlieb

có một hàm mà tôi có thể cho nó một mảng Ints và sau đó Swift sẽ trả lại cho tôi một hàm lũy thừa của 2 (hoặc 1, hoặc 3, hoặc bất cứ thứ gì) phù hợp nhất với nó? giống như tôi đưa nó: [1,2,3]nó sẽ trở lại y = xhoặc tôi sẽ đưa nó [1,4,9] nó sẽ trở lại y = x^2hoặc một cái gì đó chỉ đóng cửa theo cách đóf(x)
Honey

Nó hoạt động với tôi, nhưng sân chơi của tôi nhập UIKit theo mặc định. Và nó cũng hoạt động, nhập Foundation hoặc Darwin thay vì UIKit.
Timbergus

8

Để sử dụng các hàm toán học, bạn phải import Cocoa

Bạn có thể xem các hàm toán học được định nghĩa khác theo cách sau. Tạo Cmd-Click vào tên hàm sqrtvà bạn nhập tệp với tất cả các hàm toán học toàn cục khác và constanst.

Một đoạn nhỏ của tệp

...
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
Vâng, đó là một câu hỏi thực tế hơn "Làm cách nào để sử dụng các hàm toán học như sqrt (), floor (), round (), sin (), v.v.?"
DanEEStar

2
Nó không phải là một câu trả lời chính xác. Chúng không phải là chức năng toàn cục. Bạn phải import Cocoasử dụng chúng.
James Billingham

3

Đối với cách hoạt động của Swift, bạn có thể thử và sử dụng các công cụ có sẵn trong Thư viện chuẩn Swift. Chúng sẽ hoạt động trên bất kỳ nền tảng nào có thể chạy Swift.

Thay vì floor(), round()và phần còn lại của các quy trình làm tròn bạn có thể sử dụng 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"

Chúng hiện có sẵn trên FloatDoublenó phải đủ dễ dàng để chuyển đổi thành một CGFloatví dụ.

Thay vì sqrt()squareRoot()phương pháp trên giao thức FloatingPoint. Một lần nữa, cả hai FloatDoubletuân theo FloatingPointgiao thức:

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

Đối với các hàm lượng giác, thư viện chuẩn không thể giúp được gì, vì vậy tốt nhất bạn nên nhập Darwin trên nền tảng Apple hoặc Glibc trên Linux. Chúng sẽ là một cách gọn gàng hơn trong tương lai.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.