Swift'deki matematiksel fonksiyonlar


95

Nasıl gibi matematiksel fonksiyonları kullanırım sqrt(), floor(), round(), sin(), vs?


Yaparken:

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

Alırım:

hata: çözümlenmemiş tanımlayıcı 'kat'
kullanımı hatası: çözümlenmemiş 'sqrt' tanımlayıcısı kullanımı

görüntü açıklamasını buraya girin


Ambiguous reference to xBu yanıtı alırsanız : stackoverflow.com/a/34357943/1359306
Patrick

Yanıtlar:


98

Diğerlerinin de belirttiği gibi birkaç seçeneğiniz var. Yalnızca matematiksel fonksiyonlar istiyorsanız. Yalnızca Darwin'i içe aktarabilirsiniz.

import Darwin

Matematiksel fonksiyonlar ve diğer standart sınıflar ve fonksiyonlar istiyorsanız. Foundation'ı ithal edebilirsiniz.

import Foundation

Her şeyi ve ayrıca kullanıcı arayüzü için sınıfları istiyorsanız, oyun alanınızın OS X veya iOS için olup olmadığına bağlıdır.

OS X için Cocoa'yı içe aktarmanız gerekir.

import Cocoa

İOS için, UIKit'i içe aktarmanız gerekir.

import UIKit

File Inspector'ı (⌥⌘1) açarak oyun alanı platformunuzu kolayca keşfedebilirsiniz.

Oyun Alanı Ayarları - Platform


6
Swift oyun alanında şu hatayı alıyorum:No such module 'Cocoa'
David Poxon

@noilly: şimdi biraz geç, Playground'un dosya özelliklerinde (Cmd-Opt-0) dosya türünü iOS olarak ayarlamanız veya bunun yerine yukarıdaki yoruma göre UIKit'i içe aktarmanız gerekir
Chris Conover

1
Böyle bir modül 'Cocoa' yok
Alexander Volkov

4
UIKit, Cocoa, Foundation, tüm geçerli seçenekler.
erdekhayser

Kakao içe aktarma iOS uygulamalarında çalışmaz. "Böyle bir modül yok 'Kakao' hatası ortaya çıkıyor. UIKit'i yeni içe aktarırsanız, sqrt () kullanırken bir hata alırsınız.
SomeGuy

77

Tamamen kesin olmak gerekirse, Darwin yeterlidir. Tüm Cocoa çerçevesini içe aktarmaya gerek yok.

import Darwin

Elbette, Cocoa veya Foundation'dan veya diğer üst düzey çerçevelerden öğelere ihtiyacınız varsa, bunun yerine bunları içe aktarabilirsiniz


Ve Swift 3+ ile, sizin için Darwin'i (veya Glibc) gerekmez sqrt, floorve roundözgün olarak sırasıyla kullanabilir çünkü 0.5.squareRoot(), Int(0.5)ve 0.5.round().
Cœur

17

Linux, yani Ubuntu'da swift [2.2] kullanan kişiler için içe aktarma işlemi farklıdır!

Bunu yapmanın doğru yolu Glibc kullanmaktır. Bunun nedeni, OS X ve iOS'ta temel Unix benzeri API'lerin Darwin'de olması, ancak linux'ta bunlar Glibc'de bulunmasıdır. Foundation'ı ithal etmek burada size yardımcı olmayacak çünkü bu ayrımı kendi başına yapmıyor. Bunu yapmak için, bunu kendiniz açıkça içe aktarmanız gerekir:

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

Sen Vakfı çerçevesinin geliştirilmesini takip edebilirsiniz burada daha fazla bilgi edinmek için


DÜZENLEME: 26 Aralık 2018

Gibi işaret tarafından Cœur @ swift 3.0 başlayarak, bazı matematik fonksiyonlar artık tiplerinin kendilerini bir parçasıdır. Örneğin, Double artık bir squareRoot işlevine sahiptir. Benzer şekilde, ceil, floor, round, tüm elde edilebilir Double.rounded(FloatingPointRoundingRule) -> Double.

Dahası, Ubuntu 18.04'e swift'in en son kararlı sürümünü indirip yükledim ve görünen o Foundationki matematik işlevlerine şimdi erişmek için içeri aktarmanız gereken tek şey framework. Bunun için belge bulmaya çalıştım ama hiçbir şey çıkmadı.

➜ 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

Ve Swift 3+ ile, sizin için Darwin'i (veya Glibc) gerekmez sqrt, floorve roundözgün olarak sırasıyla kullanabilir çünkü 0.5.squareRoot(), Int(0.5)ve 0.5.round().
Cœur

@ Cœur, bir süredir hızlı ile iletişimsiz kaldım. Belki bu görüşü bir cevap şeklinde sunabilirsiniz. Teşekkürler
smac89

İçin powben dahil etmek gerekli Glibc, Linux için teşekkürler!
A1rPun

10

Bunları doğrudan hat içinde kullanabilirsiniz:

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
Şu hatayı alıyorum: çözümlenmemiş 'sqrt' tanımlayıcısının kullanımı.
Giovanni

Sanırım sqrt adında bir işlev bildirmemi bekliyor, ama açıkçası istediğim bu değil. Teşekkürler
Giovanni

UIKit veya Cocoa veya Foundation'ı içe aktarmanız gerekir.
Ben Gottlieb

Ona bir İnts dizisi verebileceğim bir fonksiyon var mı ve sonra Swift bana 2'nin (veya 1 veya 3 veya her neyse) en iyi eşleşen kuvvet fonksiyonunu döndürecek mi? benim verdiğim gibi: [1,2,3]geri y = xdönerdi y = x^2ya da verirdim [1,4,9] geri dönerdi ya da bu şekilde yakın bir şeyf(x)
Honey

Benim için çalışıyor, ancak oyun alanım varsayılan olarak UIKit'i içe aktarıyor. Ve UIKit yerine Foundation veya Darwin'i ithal ederek de işe yarıyor.
Timbergus

8

Matematik fonksiyonlarını kullanmak için yapmanız gereken import Cocoa

Diğer tanımlanmış matematiksel fonksiyonları aşağıdaki şekilde görebilirsiniz. Fonksiyon adına bir Cmd-Click yapın sqrtve dosyayı diğer tüm global matematik fonksiyonları ve tutarlı bir şekilde girin.

Dosyanın küçük bir parçası

...
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
Peki bu gerçek şu soruyu yanıtlıyor: "sqrt (), floor (), round (), sin (), vb. Gibi matematiksel fonksiyonları nasıl kullanırım?"
DanEEStar

2
Bu doğru bir cevap değil. Küresel işlevler değildirler. Sen zorunda import Cocoabunları kullanmak için.
James Billingham

3

Bir şeyleri yapmanın Swift yolu için, Swift Standard Kitaplığında bulunan araçları deneyebilir ve kullanabilirsiniz. Bunlar, Swift çalıştırabilen herhangi bir platformda çalışmalıdır.

Yerine floor(), round()ve kullanabileceğiniz yuvarlama rutinleri geri kalanı 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"

Bunlar şu anda mevcuttur Floatve örneğin Doublebir CGFloatörneğe dönüştürmek için yeterince kolay olmalıdır .

Yerine sqrt()var squareRoot()FloatingPoint protokolü yöntemi. Yine, hem Floatve Doubleuygun FloatingPointprotokol:

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

Trigonometrik fonksiyonlar için standart kütüphane yardımcı olamaz, bu yüzden Darwin'i Apple platformlarına veya Linux'ta Glibc'ye aktarmanız en iyisidir. Parmak çaprazlama, gelecekte daha temiz bir yol olacak.

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

let x = 1.571
print(sin(x))
// Prints "~1.0"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.