トップページ⇒tech
1001コメント317KB

Swift part3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2014/07/23(水) 11:46:48.42ID:x29J8vdY
WWDC2014で発表されたAppleの新言語Swiftについて語りましょう

Apple Developer
https://developer.apple.com/swift/
Welcome to Swift
https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/LandingPage/
iBooks: The Swift Programming Language
https://itunes.apple.com/jp/book/swift-programming-language/id881256329?mt=11
書籍の形にはなってないけどドキュメント
The Swift Programming Language
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097
Using Swift with Cocoa and Objective-C
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097
Swift Standard Library Reference
https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/
Swift Blog
https://developer.apple.com/swift/blog/
Resources (Xcode 6が無料でダウンロードできる)
https://developer.apple.com/swift/resources/

関連スレ
TypeScript(MS) VS Swift(Apple)
http://peace.2ch.net/test/read.cgi/tech/1401758403/
帰ってきた動的言語 VS 静的言語(代表Swift)
http://peace.2ch.net/test/read.cgi/tech/1401809550/

前スレ
Swiftスレ
http://peace.2ch.net/test/read.cgi/tech/1401736341/
Swift part2
http://peace.2ch.net/test/read.cgi/tech/1402465335/
0002デフォルトの名無しさん2014/07/23(水) 12:01:12.75ID:rdKtmwhJ
               ノ      ゚.ノヽ  , /}      ...
            ,,イ`"     、-'   `;_' '    ..::::::::::::::...
   ,-、  _.._   (        (,(~ヽ'~     ..:::::::::::::::::::::::
 )'~  レー'  〉   ヽ       i`'}       .:::::::::::::::::::::::
 ~つ     '-ー、  i       | i'     ...:::::::::::::::::::::::
 /       <  /     。/   !  ......:::::::::::::::::::::::::    これは>>1乙じゃなくて
/         ~^´     /},-'' ,●::::::::::::::::::::::::::::::::::::
i、        ,i' _,,...,-‐-、/    i  ::::::::  .:::::::::::::
..ゝ        <,,-==、   ,,-,/      .:::::::::::            放射能がうんたら
 )       {~''~>`v-''`ー゙`'~       ..:::::::::                          ........::.
 {        レ_ノ            ..::::::::.                         ......:::::::::
ノ         ''           ..:::::::                        ...::.:...:::::::::
                     .:::::::::                     ...:......:::::::::::: .
                    .:::::::::::.        .....      ..  ..::::::::::::::::::::::::   :::.
                    ::::::::::::::::.::::::....:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::.. ::  ::..
                    .:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::    ::.
                    ::::::::::::::::: :::::::::::::::::::::::::::::: :::::
                          .::    ::.  :::
0003デフォルトの名無しさん2014/07/23(水) 12:01:26.09ID:xa9IqUVv
関連スレ
プログラミング言語Swift
http://anago.2ch.net/test/read.cgi/mac/1401736921/
0004デフォルトの名無しさん2014/07/23(水) 12:02:42.28ID:rdKtmwhJ
Swift Blog
https://developer.apple.com/swift/blog/

Resources
https://developer.apple.com/swift/resources/
(Xcode 6が無料でダウンロードできる)

Swift Standard Library Reference
https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibraryReference/
0005デフォルトの名無しさん2014/07/23(水) 12:04:02.20ID:rdKtmwhJ
関連スレ

新言語Swiftを語るスレ
http://anago.2ch.net/test/read.cgi/mac/1401736249/

Wikipedia
Swift (プログラミング言語)
https://ja.wikipedia.org/wiki/Swift_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
0006デフォルトの名無しさん2014/07/23(水) 12:12:58.20ID:xa9IqUVv
>>5 のスレは、>>3のスレの前スレ
0007デフォルトの名無しさん2014/07/23(水) 12:46:53.59ID:rdKtmwhJ
The Swift Programming Language
https://itunes.apple.com/us/book/id881256329
0008デフォルトの名無しさん2014/07/23(水) 13:18:52.66ID:xa9IqUVv
>>7 >>1 iBooksの本が 7/21改訂版になった。
0009デフォルトの名無しさん2014/07/23(水) 16:58:45.20ID:x29J8vdY
>>4
そのリンク >>1 に入れてあるから
0010デフォルトの名無しさん2014/07/23(水) 20:23:53.00ID:UkE72Sh4
>>1 乙wift
0011デフォルトの名無しさん2014/07/23(水) 22:50:27.44ID:d4fKxbj7
>>8
ibookも差分アップデートしてくれたらいいのに。
0012デフォルトの名無しさん2014/07/26(土) 23:14:33.81ID:fwCKMr/Y
return って打とうとしたら RETURN が候補に出るのが邪魔だな
なんだ RETURN って
0013デフォルトの名無しさん2014/07/27(日) 02:36:22.52ID:1WIwg84i
protocol TestProt {
init(_ : Int)
}

class Test0 : TestProt {
init(_: Int) { }
}

class Test {
init() { }

func test<T : TestProt> () -> T {
return T(0)
}

func test2() -> Test0 {
return test<Test0>() // <- Cannot explicitly specialize a generic function
}
}

なぜエラーが出るのか分からない
0014デフォルトの名無しさん2014/07/27(日) 02:50:27.29ID:1WIwg84i
分かった。<Test0> が要らんのか。
return test() // これで良い
0015デフォルトの名無しさん2014/07/29(火) 00:03:30.46ID:sbHfEaWW
過疎
0016デフォルトの名無しさん2014/07/29(火) 21:51:07.47ID:DxcW8iFR
【翻訳】Go言語がダメな理由 | POSTD
 http://postd.cc/why-go-is-not-good/
・Goは何も新しいことをしない。
・Goは全てにおいてうまく設計されているとは言えない。
・Goは他のプログラミング言語から退化したものである。

要するに Google の新言語 Go への批判記事な訳だけど、
これらの視点を Swift にも当てはめてみよう

・汎用プログラミング(Generic Programming)
 良い解決策:制約ベースの汎用プログラミングとパラメータ型多相
 Swift => Haskell 等と同様に、パラメータ型多相による総称プログラミングが可能
 (ただし、この著者は Haskell の型クラスと単なる明示的パラメタ型多相とを
  ごっちゃに理解している可能性があるので、注意が必要と思われる)

・言語拡張性(Language Extensibility)
 良い解決策:演算子は関数である
 Swift => Haskell 等と同様に、演算子をオーバロード(多重定義)したり、
  プログラマがカスタム演算子を定義することすら可能

・基本ケースおよびエラー状態(Base Cases and Failure Conditions)
 良い解決策:代数的データ型と型安全なエラーモード
 Swift => Haskell 等でいう代数的データ型に相当するenum型を提供し、
  しかも独自(?)のOptional型まであるから、
  ヌルポインタのバグにさよならを告げることができる

・型推論(Type Inference)
 良い解決策:一般的な型推論
 Swift => Haskell 等の関数型言語ほど完璧ではないが、実用レベルの型推論を提供

(長いので、一旦ここで切る)
0017デフォルトの名無しさん2014/07/29(火) 22:04:22.69ID:DxcW8iFR
(>>16 の続き)

・不変性(Immutability)
 良い解決策:デフォルトで不変に設定する
 Swift => すでに ObjC 時代から(NSArray と NSMutableArray のように)デフォは
  不変性であると意識して設計されたライブラリが提供されていたのはもちろんのこと、
  手続きの宣言時に可変性を明示的に mutating で指定する構文も可能になった

・制御フロー構造(Control Flow Structures)
 良い解決策:パターンマッチングと複合式
 Swift => Rust のmatch文と同様、Swift のswitch文では、enum型(代数的データ型)の
  変数代入を伴うパターンマッチや範囲マッチ...etc を提供している

以降は「組み込みプログラミング(Embedded Programming)」における部分的課題

・部分的課題1:ヒープと動的割り当て(The Heap and Dynamic Allocation)
 良い解決策:動的割り当てを選択制にする
 Swift => メモリ制約の厳しい iOS 上では、GC の代わりに ARC が利用できます

・部分的課題2:危険な低級コード(Unsafe Low-Level Code)
 良い解決策:危険なコードの分離
 Swift => C言語の関数を透過的に呼び出すことができるので、
  危険なコードをC言語コードとして分離することが容易(=現実的なコストで実現可能)です

記事と Swift との対比は、これで終わりです
こうしてまとめると、C#/Rust/Go から遅れること数年、満を持して Apple から新登場した
後発の Swift だけあって、いかにも他言語から「いいとこどり」した設計に見えてきます
ただし、それだけ冒険的な挑戦ですから、バグ取りにもしばらくの時間が必要でしょう
0018デフォルトの名無しさん2014/07/29(火) 22:41:34.93ID:ocgppLb3
今のところサーバサイドをSwiftで書けないのが問題といえば問題かな。
Goの魅力ってそこな気がするので。
OSXがVPSで動いたりしないのかしら
0019デフォルトの名無しさん2014/07/29(火) 23:40:29.86ID:yYRcHyEO
>>18 動くだろ、VMWareとかで動くんだから。
IBMだってサーバで動かすソフトが多くなるだろうし、何の問題も無いだろ?

ただ、もう少し文字列操作系統を整備して欲しいな。 タイムスケジュールに乗ってると思うが。
0020デフォルトの名無しさん2014/07/30(水) 00:29:00.90ID:kIm/CoYC
>>19
やっぱいまさらサーバサイドにLinux以外の使うの無理だった。
OSXはクライアントOSとしてしか使う気ないわ・・・。
ということでLinux版希望
0021デフォルトの名無しさん2014/07/30(水) 00:35:17.91ID:CP3nSahn
了解で〜す \(^o^)/
0022デフォルトの名無しさん2014/07/30(水) 09:24:00.96ID:Nn5HlRg1
SwiftのコンパイラはClangに組み込んだんだから丸ごとオープンソース希望。
0023デフォルトの名無しさん2014/07/30(水) 11:03:58.55ID:s1QrMkjS
待ってればオープンソース化はされるでしょ
0024デフォルトの名無しさん2014/07/30(水) 11:09:04.86ID:JrJAkBVK
Linux 版 Swift はかなり期待できるが Linux 版 Cocoa は絶望的。
0025デフォルトの名無しさん2014/07/30(水) 12:33:27.29ID:UUAxeW7b
SwiftはClangじゃないと何度言ったら
0026デフォルトの名無しさん2014/07/30(水) 12:48:18.10ID:ddZSmXRh
処理系なんて複数あってもいい
0027デフォルトの名無しさん2014/07/30(水) 15:04:01.42ID:XjaaJasK
うーん、なら意味ないな
0028デフォルトの名無しさん2014/07/31(木) 11:11:54.32ID:qwayji1U
今更ながらSwiftが並列処理の構文を持ってないことに気がついた
0029デフォルトの名無しさん2014/07/31(木) 11:25:03.08ID:u2zE/A7k
>>28 現在 Swift parallel scripting と提携を考えてる最中と妄想。 これで真のSwift languageを名乗れるようになる。
或はIBM PowerPC用にIBMと協議中とか。

並列処理は結構ニーズが有るから慎重でも良い。 既にライブラリは揃ってるわけだし。
0030デフォルトの名無しさん2014/07/31(木) 11:30:10.32ID:qwayji1U
llvmスレで、次の3.5でOpenMP対応って見て、アレ?って思って見に来たんだ。
0031デフォルトの名無しさん2014/07/31(木) 18:42:52.09ID:24Rz0y8q
>>28
ライブラリで対応っしょ。
何にしろGCD使うわけだし
0032デフォルトの名無しさん2014/08/03(日) 03:35:04.75ID:8apJq8+R
gcdの構文はそのまま使えるし、NSThread使ってもいいし、NSOperation使ってもいい
pthread直接は関数ポインタ使うから無理かな
0033デフォルトの名無しさん2014/08/05(火) 18:39:01.56ID:0W537iyt
http://i.imgur.com/KAy2c3Q.png
0034デフォルトの名無しさん2014/08/05(火) 19:34:08.48ID:o+/LR7Kj
>>33
小文字のLじゃなくて大文字のiになってるとか?(見やすくするために大文字小文字逆にして書いてます)
0035デフォルトの名無しさん2014/08/05(火) 21:38:06.91ID:q3/M2RFT
>>34 良く有る事だが、見えない文字が入ってるとか。
一度全部削除して入れ直せば大丈夫だろうが、Fix it したほうが早いね。
0036デフォルトの名無しさん2014/08/06(水) 10:23:13.01ID:+oVXtDw0
Fix-itダブルクリックしてもなおらんなら、、、
0037デフォルトの名無しさん2014/08/07(木) 11:01:38.76ID:so7ZCTBn
バージョンがあがる度に糞度が増してるな
0038デフォルトの名無しさん2014/08/08(金) 07:56:57.30ID:0RLXnAM8
>>32 Cのライブラリは全て直接使えるよ。
関数ポインタだって扱える

Function Pointers

C function pointers are imported into Swift as CFunctionPointer<Type>, where Type is a Swift function type.
For example, a function pointer that has the type int (*)(void) in C is imported into Swift as CFunctionPointer<() -> Int32>.
0039デフォルトの名無しさん2014/08/08(金) 14:04:26.83ID:t4nUvWhz
暗黙型変換は無いけど、リテラルは暗黙的に型変換されるの?

func fn(a: Int) -> Int {
return a
}

fn(5) // => 5
fn(5.3) // => 5

let num = 5.3
fn(num) // Error: "Double" is not convertible to 'Int'
fn(Int(num)) // => 5
0040デフォルトの名無しさん2014/08/08(金) 14:14:09.50ID:FHu5gdbl
リテラルなんだからコンパイル時に判断できるからじゃね
0041デフォルトの名無しさん2014/08/08(金) 14:22:23.37ID:0RLXnAM8
>>39 そうみたいだね、コンパイラのバグだと思ってた方が良さそうだね 多分型変換しているつもりはないんだろう
0042デフォルトの名無しさん2014/08/08(金) 14:34:06.27ID:eIB6EleC
f(2.5 + 3.5) // => 5
とか、どこがセーフティなんだって感じだな
0043デフォルトの名無しさん2014/08/08(金) 14:44:54.31ID:OLXn5oNK
>>41
バグではないでしょ
型変換しているつもりが無いっていうか、型変換などしていない。
>>40の言うとおり、リテラルだからコンパイル時に型が決定しているだけ。
fnの引数の型がIntだから最初からInt型になるだけ。
5.3だからDoubleになってIntに型変換されているんじゃない。最初からInt。
これは関数の引数だけじゃなくて代入でも同じ。
let num : Int = 5.3
と書いてもエラーにならない。Double型の5.3がIntに型変換されて代入されるのではなくて、最初からInt。
0044デフォルトの名無しさん2014/08/08(金) 14:51:28.10ID:0RLXnAM8
エラーにすべきだろ
0045デフォルトの名無しさん2014/08/08(金) 14:57:27.75ID:eIB6EleC
そんなことより、Playgroundで、
println("\(1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1)")
がちゃんと動かないんだけど、\()の中って長過ぎるとダメとかあるんだっけ?
0046デフォルトの名無しさん2014/08/08(金) 15:00:48.88ID:t4nUvWhz
>>43

5 >= 5.3 // true

とかどう考えても嬉しくないんだけど
0047デフォルトの名無しさん2014/08/08(金) 16:49:34.13ID:eIB6EleC
いや、そんなことより、
println("hogehoge".length)
って書けるのに、

let str = "hogehoge"
println(str.length)
って書けないのはなんで?
0048デフォルトの名無しさん2014/08/08(金) 16:58:51.21ID:NYRFXe49
えっ
0049デフォルトの名無しさん2014/08/08(金) 17:06:32.25ID:eIB6EleC
自己解決しました。
0050デフォルトの名無しさん2014/08/09(土) 17:04:50.89ID:N+zBGm2p
ディクショナリの初期化の仕方はどれでいいんですか?
いろんな書き方があるので迷いまする
var d: Dictionary<String, Int> = [:]
var d: [String: Int] = [:]
var d = [String: Int]()
var d = Dictionary<String, Int>()
0051デフォルトの名無しさん2014/08/09(土) 17:33:00.24ID:3ND9e6Sl
var d = Dictionary<String, Int>()
しっくりくる
0052デフォルトの名無しさん2014/08/09(土) 17:57:04.42ID:7nARyUM7
>>50
var d = [String: Int]()

> You can also write the type of a dictionary in shorthand form as [KeyType: ValueType].
> Although the two forms are functionally identical, the shorthand form is preferred,
> and is used throughout this guide when referring to the type of a dictionary.
0053デフォルトの名無しさん2014/08/09(土) 18:21:33.99ID:N+zBGm2p
>>51-52
ありがとございました
アップル推奨の奴でいきまする
0054デフォルトの名無しさん2014/08/09(土) 22:19:51.31ID:TSdBD6Gl
>>51だとC#と同じになっちゃうから林檎教団的には気に入らないだろうな
0055デフォルトの名無しさん2014/08/09(土) 22:31:53.48ID:3ND9e6Sl
林檎教団w
C++みたいで、見慣れてるって思った
0056デフォルトの名無しさん2014/08/10(日) 00:24:39.30ID:y9erLln4
>>54 気に入らんね。 わざわざDictionary なんて無駄の何物でもないし、
教祖様おすすめの新記法を使うべきだろ
0057デフォルトの名無しさん2014/08/10(日) 00:44:53.30ID:9qr6A6n9
教壇とか信者とか教祖とかどうでもいいんだよ
自分がいちばん良いと思う(あるいは、コーディング規約で定められた)記法を使うだけだ。
自分で書くとしたらvar d = [ String : Int ]()かな。
0058デフォルトの名無しさん2014/08/10(日) 03:53:48.49ID:9xNLSGsY
Swiftで脱アルゴリズムっすよ。
0059デフォルトの名無しさん2014/08/10(日) 22:20:58.90ID:ooL2SMwQ
っすよ
0060デフォルトの名無しさん2014/08/10(日) 22:29:20.21ID:JTN9tFDt
var d[String: Int] = [:]
の方が好きだけど
var d = ["salary": 300000]
のように空で無いときと統一するなら(右辺で型推論するなら)、>>57と同じだなあ

悩ましい
0061デフォルトの名無しさん2014/08/11(月) 04:24:18.04ID:cC/8Gjcj
>>52 だとしても
var d: [String: Int] = [:]
が推奨されてないわけではない
0062デフォルトの名無しさん2014/08/11(月) 11:14:02.48ID:HXiuyVVb
推奨は
var namesOfIntegers = [Int: String]()
でイニシャライズして
namesOfIntegers[16] = "sixteen"
と値を入れても
namesOfIntegers = [:]
で再初期化出来る と言う流れ
0063デフォルトの名無しさん2014/08/13(水) 16:59:09.89ID:xwn08+4R
>>62
なるほど
0064デフォルトの名無しさん2014/08/15(金) 12:28:19.59ID:HBtdHn8g
StringやIntのhashValueこれでいいのかな

"a".hashValue // 4799450059485595655
"b".hashValue // 4799450059485595656

連続しすぎで簡単に衝突しそう
0065デフォルトの名無しさん2014/08/15(金) 13:09:55.51ID:W4XUmOz/
連続性と衝突のし易さに関する相関関係について述べよ
0066デフォルトの名無しさん2014/08/15(金) 13:35:15.80ID:HBtdHn8g
いくつかのハッシュを組み合わせるときに単純にXOR取るだけだと衝突しやすいだろ
あと予測しやすいのでDoS攻撃もしやすい
0067デフォルトの名無しさん2014/08/15(金) 13:44:09.62ID:HBtdHn8g
struct Person: Hashable {
var age: Int
var name: String
var hashValue: Int { return age.hashValue ^ name.hashValue }
}

func ==(l: Person, r: Person) -> Bool { return l.age == r.age && l.name == r.name }

// ↓全部同じ
Person(age: 20, name: "a").hashValue
Person(age: 27, name: "b").hashValue
Person(age: 30, name: "c").hashValue
0068デフォルトの名無しさん2014/08/15(金) 14:03:31.32ID:ctFtgwKN
Javaも31のマジックナンバー掛けて足してくだけだったりするしな。
そのハッシュは暗号化の意味は持ってなくてぶつからないように散らすという意味しかないよ。
攻撃されるような、つまりハッシュを外部に見せる場所では使うべきじゃない。
0069デフォルトの名無しさん2014/08/15(金) 14:37:01.87ID:IEcKMmnc
そうそう。JavaのStringクラスは1文字の場合、charの値がそのままハッシュ値になるし、
整数なら整数値がそのままハッシュ値になるのは、JavaもSwiftも同じ
ただ、ハッシュの計算法については明文化してほしいよなあ。これはObj-Cの時からだけど
0070デフォルトの名無しさん2014/08/15(金) 14:47:41.59ID:W4XUmOz/
>>67
なんで XORとるの?

var hashValue: Int { return (String(age) + ":" + name).hashValue }

とかじゃダメなの?
0071デフォルトの名無しさん2014/08/15(金) 14:53:58.04ID:HBtdHn8g
まぁ気に入らなきゃ extension で全て解決やな
お騒がせ
0072デフォルトの名無しさん2014/08/15(金) 14:59:37.87ID:Lne+Px+X
そうだ
靖国、
逝こう。
0073デフォルトの名無しさん2014/08/15(金) 15:17:20.80ID:IEcKMmnc
>>70
それだとハッシュ値計算が重くなるよ。
単純な数値計算が望ましいから、Javaみたいにするのが無難
0074デフォルトの名無しさん2014/08/15(金) 15:21:15.99ID:IEcKMmnc
>>71
いやだから、StringのhashValue変えることに意味無いんだって。
この場合、XORでなく、他の方法でハッシュ値求めればいいだけだよ
0075デフォルトの名無しさん2014/08/15(金) 15:35:30.99ID:ZaXPBhtE
いつでも重複しにくい推測されにくいような値になる計算をとしたらmdやshaみたいなことになって、
それをインスタンスを作るたびに計算をさせていたらクソ遅いとかw
0076デフォルトの名無しさん2014/08/15(金) 15:47:01.00ID:HBtdHn8g
>>74
もうSipHash 2-4で実装しなおした
0077デフォルトの名無しさん2014/08/15(金) 16:14:55.16ID:IEcKMmnc
>>76
などほどHashDoSか
でもSwiftってiOS/OSX向けだからDoS攻撃されることなくね?
あと、スクリプト言語はともかく、Obj-C並みの速度で動作するSwiftへのパフォーマンスの影響はいかほどなんだろう。
0078デフォルトの名無しさん2014/08/16(土) 00:47:57.07ID:XlNU51V9
extensionは関数のオーバーライドできないんだな。Obj-Cはできていたが
0079デフォルトの名無しさん2014/08/16(土) 08:42:21.65ID:DXpV4TuM
え?
0080デフォルトの名無しさん2014/08/17(日) 11:21:02.10ID:NRGjpcdU
これがエラーになるんですがなんでですかね?

var d = ["a": 10, "b": "BBB"]
d["C"] = "123"


ちなみに、こっちはOKでした。

var d:[String: Any]= ["a": 10, "b": "BBB"]
d["C"] = "123"
0081デフォルトの名無しさん2014/08/17(日) 13:19:14.20ID:V8SXHhEt
無限ループこわい

struct S {
var a: Int = 0 {
didSet {
println("a did set: ¥(a)")
b = a + 1
}
}
var b: Int = 0 {
didSet {
println("b did set: ¥(b)")
a = b + 1
}
}
}

var s = S(a: 0, b: 0)
s.a = 1

a did set: 1
b did set: 2
a did set: 3
b did set: 4
a did set: 5
b did set: 6
a did set: 7
…
■ このスレッドは過去ログ倉庫に格納されています