

`as Int`と`Int()`の違いを教えていただきたいです。

swiftでキャストをする際は`as Hoge`とすると、キャストされるかと思います。  
そして、`Int()`もIntにキャストしてくれる関数との認識です。  
appleの公式ドキュメントを見たり、ぐぐってみましたが、両者の違いがいまいちよくわかっておりません。

以下のキャプチャのコードで、`as Int`と`Int()`でキャストをしてみると、`as Int`のほうだけ、  
エラーが出てしまいます。UInt32をIntにキャストできないというエラーなら、`Int()`でも  
同じエラーが出ていいと思うのですが、出ないということからすると両者の挙動に  
違いがあるのだろうなと考えています。

そもそも、UInt32をIntにキャストできないのも謎で、  
そちらも合わせてご説明いただけると幸いです。  
よろしくお願いします。  
![キャスト](https://i.stack.imgur.com/xiqRq.png)

なお、補足ですが、`arc4random()`はUInt32の戻り値を持っています。


CC BY-SA 3.0
2015-01-16T03:13:09.337
4652
2015-01-16T04:15:18.417
5852
question
ios swift xcode
swiftのキャストの言語仕様に関して


swiftの`Type casting`はクラス階層上でのキャストです。  
`Int`と`UInt32`には継承関係がないのでキャストできません。

> Type casting is a way to check the type of an instance, and/or to  
>  treat that instance as if it is a different superclass or subclass  
>  from somewhere else in its own class hierarchy.

<https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TypeCasting.html>

`Int()`はキャストではなく`Int`型のinitializerの呼び出しです。


CC BY-SA 3.0
2015-01-16T03:55:31.160
4656
2015-01-16T03:55:31.160
3639
4652
answer


as Intは形変換処理で、Int(xxx)は **初期化処理** です。


CC BY-SA 3.0
2015-01-16T04:05:28.857
4658
2015-01-16T04:05:28.857
7454
4652
answer


asは「ダウンキャスト」を行います。  
サンプル：（最初のimport Foundationは必要）

[code]

    import Foundation
    
    var myArray: [AnyObject] = ["Tomas", 24, 174.8]
    let name = myArray[0] as String
    let age = myArray[1] as Int
    let height = myArray[2] as Float
    
[/code]

型AnyObjectが、String、Int、Floatに対して継承関係があるから、asでダウンキャストできます。String、Int、Floatの間では、継承関係がないので、asでキャストできません。Int32もおなじ。

もうひとつ。typealiasで作成した型と、元の型の間のキャストも、asで行えます。

[code]

    typealias MyInt = Int
    
    let value: MyInt = 34
    let value2 = value as Int
    let value3: Int = 54
    let value4 = value3 as MyInt
    
[/code]


CC BY-SA 3.0
2015-01-16T04:15:18.417
4660
2015-01-16T04:15:18.417
7362
4652
answer