Математические функции в Swift

95

Как использовать математические функции , такие как sqrt(), floor(), round(), sin()и т.д.?


При выполнении:

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

Я получил:

ошибка: использование неразрешенного идентификатора 'floor'
ошибка: использование неразрешенного идентификатора 'sqrt'

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

Джованни
источник
Если вы получите Ambiguous reference to xответ, проверьте: stackoverflow.com/a/34357943/1359306
Патрик

Ответы:

98

Как уже отмечалось, у вас есть несколько вариантов. Если вам нужны только математические функции. Вы можете импортировать только Дарвина.

import Darwin

Если вам нужны математические функции и другие стандартные классы и функции. Вы можете импортировать Foundation.

import Foundation

Если вам нужно все, а также классы для пользовательского интерфейса, это зависит от того, предназначена ли ваша игровая площадка для OS X или iOS.

Для OS X вам нужно импортировать Cocoa.

import Cocoa

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

import UIKit

Вы можете легко обнаружить платформу своей игровой площадки, открыв File Inspector (⌥⌘1).

Настройки игровой площадки - Платформа

Томаш Линхарт
источник
6
На игровой площадке Swift я получаю ошибку:No such module 'Cocoa'
Дэвид Поксон,
@noilly: сейчас вроде как поздно, вам нужно установить тип файла на iOS в свойствах файла Playground (Cmd-Opt-0) или вместо этого импортировать UIKit, согласно приведенному выше комментарию
Крис Коновер,
1
Нет такого модуля «Какао»
Александр Волков
4
UIKit, Cocoa, Foundation, все допустимые варианты.
erdekhayser
Импорт Какао не работает в приложениях iOS. Ошибка «Нет такого модуля« Какао ». Если вы просто импортируете UIKit, вы получите ошибку при использовании sqrt ().
SomeGuy
77

Чтобы быть совершенно точным, достаточно Дарвина. Нет необходимости импортировать всю структуру Какао.

import Darwin

Конечно, если вам нужны элементы из Cocoa или Foundation или других фреймворков более высокого уровня, вы можете импортировать их вместо

bpresles
источник
И с Свифта 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 базовые Unix-подобные API находятся в Дарвине, но в Linux они расположены в Glibc. Импорт Foundation здесь не поможет, потому что сам по себе не делает различий. Для этого вам нужно явно импортировать его самостоятельно:

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

Вы можете следить за развитием платформы Foundation здесь, чтобы узнать больше


РЕДАКТИРОВАТЬ: 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
smac89
источник
И с Свифта 3+, вам не нужно Дарвина (или Glibc) для sqrt, floorи roundпотому , что вы можете использовать изначально , соответственно 0.5.squareRoot(), Int(0.5)и 0.5.round().
Cœur
@ Cœur, я какое-то время не был в контакте с swift. Возможно, вы можете предложить это понимание в форме ответа. Спасибо
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, или Cocoa, или Foundation.
Бен Готтлиб
есть ли функция, в которой я могу передать ей массив Ints, а затем Swift вернет мне функцию мощности 2 (или 1, или 3, или что-то еще), которая лучше всего ей соответствует? как я его даю: [1,2,3]он вернется y = xили я дам его [1,4,9] он вернется y = x^2или что-то в этом родеf(x)
Дорогая,
У меня это работает, но моя игровая площадка по умолчанию импортирует UIKit. И это тоже работает, импортируя Foundation или Darwin вместо UIKit.
Timbergus 07
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)        */
...
DanEEStar
источник
1
Это ответ на вопрос: «Как использовать математические функции, такие как sqrt (), floor (), round (), sin () и т. Д.?»
DanEEStar
2
Это неправильный ответ. Это не глобальные функции. Вы должны import Cocoaих использовать.
Джеймс Биллингем,
3

Что касается Swift, вы можете попробовать использовать инструменты, доступные в стандартной библиотеке 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()

Для тригонометрических функций стандартная библиотека не может помочь, поэтому вам лучше импортировать Darwin на платформах 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"
Хитрый
источник