Swiftの数学関数


95

どのように私のような数学関数を使用しないsqrt()floor()round()sin()、など?


行うとき:

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

私は得ます:

エラー:未解決の識別子「floor」の
使用エラー:未解決の識別子「sqrt」の使用

ここに画像の説明を入力してください


Ambiguous reference to xチェックアウトした場合は、この回答を確認してください:stackoverflow.com/a/34357943/1359306
Patrick

回答:


98

他の人が指摘したように、いくつかのオプションがあります。数学関数だけが必要な場合。インポートできるのはDarwinのみです。

import Darwin

数学関数およびその他の標準クラスと関数が必要な場合。Foundationをインポートできます。

import Foundation

ユーザーインターフェイスのすべてとクラスも必要な場合は、プレイグラウンドがOS X用かiOS用かによって異なります。

OS Xの場合は、Cocoaをインポートする必要があります。

import Cocoa

iOSの場合、UIKitをインポートする必要があります。

import UIKit

ファイルインスペクタ(⌥⌘1)を開くと、プレイグラウンドプラットフォームを簡単に見つけることができます。

遊び場の設定-プラットフォーム


6
スウィフトの遊び場で、私はエラーを取得する:No such module 'Cocoa'
デビッドPoxon

@noilly:ちょっと今のところ、Playgroundのファイルプロパティ(Cmd-Opt-0)でファイルタイプをiOSに設定するか、代わりにUIKitをインポートする必要があります。上記のコメント
Chris Conover

1
そのようなモジュールはありません 'Cocoa'
Alexander Volkov

4
UIKit、Cocoa、Foundation、すべての有効な選択肢。
erdekhayser 2014年

CocoaのインポートはiOSアプリケーションでは機能しません。「いいえ、そのようなモジュール『ココア』エラーarrisesあなただけのUIKitをインポートする場合、あなたはSQRTを(使用上のエラーを取得します)。。
SomeGuy

77

正確には、ダーウィンで十分です。Cocoaフレームワーク全体をインポートする必要はありません。

import Darwin

もちろん、Cocoa、Foundation、またはその他の上位レベルのフレームワークの要素が必要な場合は、代わりにそれらをインポートできます


そしてスウィフト3+で、あなたがのためにダーウィン(またはglibcで)を必要としないsqrtfloorroundあなたはネイティブにそれぞれ使用することができますので0.5.squareRoot()Int(0.5)0.5.round()
2018年

17

LinuxすなわちUbuntuでswift [2.2]を使用している人にとって、インポートは異なります!

これを行う正しい方法は、Glibcを使用することです。これは、OS XとiOSでは、基本的なUnixのようなAPIがDarwinにありますが、LinuxではGlibcにあるためです。Importing Foundationは、それ自体では区別されないため、ここでは役に立ちません。これを行うには、自分で明示的にインポートする必要があります。

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

ここで Foundationフレームワークの開発をフォローして、詳細を学ぶことができます。


編集:2018年12月26日

指摘・クール@ SWIFT 3.0から始めて、いくつかの数学関数は現在のタイプそのものの一部です。たとえば、DoubleにはsquareRoot関数があります。同様に、ceilfloorround、すべてを達成することができます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で)を必要としないsqrtfloorroundあなたはネイティブにそれぞれ使用することができますので0.5.squareRoot()Int(0.5)0.5.round()
2018年

@Cœur、私はしばらくの間迅速に連絡を取り合っていない。おそらく、あなたは答えの形でこの洞察を提供することができます。ありがとう
smac89 2018年

以下のために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をインポートする必要があります。
ベンゴットリーブ2014年

Intの配列を与えることができる関数はありますか?Swiftはそれに最もよく一致する2の累乗(または1、3、またはその他)の関数を私に返しますか?私が与えるように:[1,2,3]それは戻るy = xか、それを与える[1,4,9]それは戻るy = x^2か、そのような方法でちょうど何かに近いf(x)
ハニー

それは私のために働いています、しかし私の遊び場はデフォルトでUIKitをインポートします。また、UIKitの代わりにFoundationまたはDarwinをインポートしても機能します。
Timbergus 2017年

8

あなたがしなければならない数学関数を使用するには import Cocoa

他の定義済み数学関数は、次の方法で確認できます。関数名sqrtをCmd キーを押しながらクリックすると、他のすべてのグローバル数学関数と定数を含むファイルを入力できます。

ファイルの小さなスニペット

...
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、2014年

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ありDoubleCGFloatたとえばに変換するのは簡単です。

代わりにsqrt()ありますsquareRoot()浮動小数点プロトコルの方法。ここでも、両方FloatDoubleに準拠しFloatingPointたプロトコル:

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

三角関数の場合、標準ライブラリは役に立たないため、AppleプラットフォームのDarwinまたはLinuxのGlibcをインポートすることをお勧めします。指を交差させることで、将来的にすっきりした方法になるでしょう。

#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.