Математичні функції у Свіфті


95

Як використовувати математичні функції , такі як sqrt(), floor(), round(), sin()і т.д.?


При виконанні:

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

Я отримав:

помилка: використання невирішеного ідентифікатора "нижня"
помилка: використання невирішеного ідентифікатора "sqrt"

введіть тут опис зображення


Якщо ви Ambiguous reference to xперевірите цю відповідь: stackoverflow.com/a/34357943/1359306
Патрік

Відповіді:


98

Як зазначали інші, у вас є кілька варіантів. Якщо ви хочете лише математичні функції. Ви можете імпортувати лише Дарвін.

import Darwin

Якщо вам потрібні математичні функції та інші стандартні класи та функції. Ви можете імпортувати Foundation.

import Foundation

Якщо ви хочете все, а також класи для користувальницького інтерфейсу, це залежить від того, чи ваш майданчик для OS X або iOS.

Для OS X вам потрібно імпортувати какао.

import Cocoa

Для iOS потрібно імпортувати UIKit.

import UIKit

Ви можете легко відкрити свою платформу дитячого майданчика, відкривши File Inspector (⌥⌘1).

Налаштування дитячого майданчика - платформа


6
На дитячому майданчику Свіфта я отримую помилку:No such module 'Cocoa'
Девід Поксон,

@noilly: якось пізно, вам потрібно встановити тип файлу на iOS у властивостях файлу Playground (Cmd-Opt-0) або замість цього імпортувати UIKit, відповідно до коментаря вище
Кріс Коновер,

1
Немає такого модуля «Какао»
Олександр Волков

4
UIKit, Какао, Фонд, всі дійсні варіанти.
erdekhayser

Імпорт какао не працює в додатках iOS. Виникає помилка "Немає такого модуля" Какао ". Якщо ви просто імпортуєте UIKit, ви отримуєте помилку щодо використання sqrt ().
SomeGuy

77

Якщо бути абсолютно точним, досить Дарвіна. Не потрібно імпортувати всю структуру какао.

import Darwin

Звичайно, якщо вам потрібні елементи з какао, фундаменту або інших фреймворків вищого рівня, ви можете замість цього імпортувати їх


А в Swift 3+ вам не потрібен Дарвін (або Glibc) sqrt, floorа roundтому, що ви можете використовувати відповідно власне 0.5.squareRoot(), Int(0.5)і 0.5.round().
Cœur

17

Для людей, які використовують швидкий [2.2] на Linux, тобто Ubuntu, імпорт відрізняється!

Правильний спосіб зробити це - використовувати Glibc. Це пояснюється тим, що в OS X та iOS основні Unix-подібні API знаходяться в Дарвіні, а в Linux вони знаходяться в Glibc. Імпортуючий фонд не допоможе вам тут, оскільки він не робить відмінностей сам по собі. Для цього вам потрібно явно імпортувати його самостійно:

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

Ви можете стежити за розробкою основи Фонду тут, щоб дізнатись більше


EDIT: 26 грудня 2018 р

Як зазначив на @ Кер , починаючи з стрижа 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

А в Swift 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'.
Джованні

Я думаю, що він очікує від мене оголошення функції з назвою sqrt, але, очевидно, це не те, що я хочу. Дякую
Джованні

Вам потрібно імпортувати UIKit, або какао, або основу.
Бен Готліб

чи є функція, де я можу дати йому масив Ints, і тоді Свіфт поверне мені функцію потужності 2 (або 1, або 3, або що завгодно), яка найкраще відповідає їй? як я його даю: [1,2,3]воно повернеться, y = xабо я дам йому [1,4,9] воно повернеться, y = x^2або щось просто близьке в такий спосібf(x)
Мед

Це працює для мене, але мій майданчик імпортує UIKit за замовчуванням. І це теж працює, імпортуючи Фонд або Дарвін замість UIKit.
Тімбергус

8

Для використання математичних функцій вам потрібно import Cocoa

Ви можете побачити інші визначені математичні функції таким чином. Зробіть Cmd-Клацніть на назву функції, 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ними користуватися.
Джеймс Біллінгем,

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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.