こんにちは。
Swiftにて例えば引数に値を渡すときはCGFloat型は使えないそうなのですが、
その場合、Int型に変換してから送るのが正しいのでしょうか?
短い質問ですいませんが、よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
引数に値を渡すときはCGFloat型は使えないそうなのですが
使えます
投稿2018/01/06 07:26
総合スコア3384
0
ベストアンサー
swiftでは浮動小数点数を表す型として精度の異なる2種類の基本型がありますね。
Float(IEE 32bit floating point number)
Double(IEEE 64bit floating point number)
また静的型付けの言語なので、変数や関数の引数や戻り値の型はコンパイルする時点で確定しており、さらに型が違うもの同士に対するなんらかの適用(演算や変数への代入や実引数の指定など)はもし適切なオーバーロードが定義されてなければエラーになるので、次のようなことが起きます。
swift
1func forFloat(_ v: Float) {} 2 3forFloat(1.0) // OK (定数は適用しようとしている型に合わせて適当に変換してくれるらしい) 4 5let v = 1.0 // (型推論規則によってvはDoubleと仮定される?) 6forFloat(v) // NG (Float型の引数にDouble型の値は渡せない)
さてCGFloatはプロセッサーアーキテクチャーによって実際の型がFloatまたはDoubleのどちらかになる型エリアスだそうです。コンパイルする環境によってはFloatになったりDoubleになったりするのですがそれをきちんと把握せずにルーズにFloatやDoubleの値を適用しようとすると当然ながらエラーになるケースが出てきます。
swift
1func forCGFloat(_ v: CGFloat) {} 2 3forCGFloat(1.0) // OK 4 5let a: CGFloat = 1.0 6forCGFloat(a) // OK 7 8let d = 1.0 9forCGFloat(d) // OKかもしれないしNGかも知れない 10 11let f: Float = 1.0 12forCGFloat(f) // OKかもしれないしNGかも知れない
要するに「型が一致していないものを適用するときには変換を明示しないとコンパイルエラーになっちゃいますよ」ということで、逆に言えば適切に型変換を行いさえすれば問題ないということかと思います。
swift
1func forCGFloat(_ v: CGFloat) {} 2 3forCGFloat(1.0) // OK 4 5let a: CGFloat = 1.0 6forCGFloat(a) // OK 7 8let d = 1.0 9forCGFloat(CGFloat(d)) // OK 10 11let f: Float = 1.0 12forCGFloat(CGFloat(f)) // OK
Int型に変換してから送るのが正しいのでしょうか?
どのような型をどのような型に適用するかをきちんと考えずに「Int型に変換すればよい」と考えることは間違いであると思います。
投稿2018/01/06 08:03
編集2018/01/06 08:31総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。