Swift의 수학 함수


95

어떻게 같은 수학 함수를 사용합니까 sqrt(), floor(), round(), sin(), 등?


할 때 :

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

나는 얻다:

오류 : 해결되지 않은 식별자 'floor'
사용 오류 : 해결되지 않은 식별자 'sqrt'사용

여기에 이미지 설명 입력


당신이 얻을 경우 Ambiguous reference to x: 아웃이 답변 확인 stackoverflow.com/a/34357943/1359306
— 패트릭

답변:


98

다른 언급했듯이 몇 가지 옵션이 있습니다. 수학 함수 만 원하는 경우. Darwin 만 가져올 수 있습니다.

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'
— David Poxon 2014-06-11

@noilly : 좀 늦게 지금, 당신은 위의 의견에 따라, 대신 놀이터의 파일 속성 (Cmd를-탈퇴 0), 또는 수입 UIKit에 아이폰 OS에 파일 형식을 설정해야합니다
— 크리스 코노

1
이러한 모듈 없다 '코코아'
— 알렉산더 볼코프

4
UIKit, Cocoa, Foundation, 모든 유효한 선택.
— erdekhayser 2014

Cocoa 가져 오기는 iOS 애플리케이션에서 작동하지 않습니다. "No such module 'Cocoa'오류가 발생합니다. UIKit 만 가져 오면 sqrt () 사용시 오류가 발생합니다.
— SomeGuy

77

정확히 말하면 다윈이면 충분합니다. 전체 Cocoa 프레임 워크를 가져올 필요가 없습니다.

import Darwin

물론 Cocoa, Foundation 또는 기타 상위 프레임 워크의 요소가 필요한 경우 대신 가져올 수 있습니다.


그리고 스위프트 3+, 당신은 다윈 (또는 Glibc의)가 필요하지 않습니다 sqrt, floor그리고 round당신이 기본적으로 각각 사용할 수 있기 때문에 0.5.squareRoot(), Int(0.5)하고 0.5.round().
— Cœur

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

당신은 재단 프레임 워크의 개발을 따를 수 있습니다 여기에 자세한 내용을 보려면


수정 : 2018 년 12 월 26 일

으로 지적 으로 쾨르 @ 빠른 3.0부터, 일부 수학 함수는 이제 유형 자체의 일부입니다. 예를 들어 Double 에는 이제 squareRoot 함수가 있습니다. 마찬가지로, ceil, floor, round, 모두 달성 될 수있다 Double.rounded(FloatingPointRoundingRule) -> Double.

게다가 우분투 18.04에 최신 안정 버전의 swift를 다운로드하여 설치했는데, 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의)가 필요하지 않습니다 sqrt, floor그리고 round당신이 기본적으로 각각 사용할 수 있기 때문에 0.5.squareRoot(), Int(0.5)하고 0.5.round().
— Cœur

@ Cœur, 나는 한동안 swift와 연락이 끊겼습니다. 아마도 답의 형태로 이러한 통찰력을 제공 할 수있을 것입니다. 감사합니다
— smac89

들어 pow나는 포함하는 데 필요한 Glibc, 리눅스에 대한 감사합니다!
— 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을 가져와야합니다.
— Ben Gottlieb

Int 배열을 줄 수있는 함수가 있고 Swift가 가장 일치하는 2의 거듭 제곱 (또는 1, 3 등)의 함수를 반환 할 수 있습니까? 내가주는 것처럼 : [1,2,3]그것은 돌아올 것입니다 y = x또는 나는 그것을 줄 것입니다 [1,4,9] 그것은 돌아올 것입니다 y = x^2또는 그런 식으로 그냥 닫힐 것입니다f(x)
— Honey

나를 위해 작동하지만 내 놀이터는 기본적으로 UIKit을 가져옵니다. 또한 UIKit 대신 Foundation 또는 Darwin을 가져 와서 작동합니다.
— Timbergus

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
"sqlt (), floor (), round (), sin () 등과 같은 수학 함수를 어떻게 사용합니까?"라는 실제 질문에 대한 답변입니다.
— DanEEStar 2014-06-03

2
정답이 아닙니다. 전역 함수가 아닙니다. 당신은 import Cocoa그들을 사용해야합니다.
— James Billingham

3

Swift 방식으로 작업을 수행하려면 Swift Standard Library에있는 도구를 사용해 볼 수 있습니다. 이는 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()부동 소수점 프로토콜에 대한 방법. 다시 말하지만, 모두 Float와 Double을 준수 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.