トップページ⇒tech
1002コメント383KB

Swift part9 [無断転載禁止]©5ch.io

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん 転載ダメ©2ch.net (ワッチョイ 8b3c-/6Y/)2016/10/18(火) 11:34:44.16ID:oLo879ze0
WWDC2014で発表されたAppleの新言語Swiftについて語りましょう

関連スレ

プログラミング言語Swift 3
http://potato.2ch.net/test/read.cgi/mac/1408762479/

[SDK]iPhoneアプリ開発初心者質問箱47[touch][iPad]
http://potato.2ch.net/test/read.cgi/mac/1470902093/

Xcode part14
http://potato.2ch.net/test/read.cgi/mac/1476190499/

Swiftアンチスレ part1
http://echo.2ch.net/test/read.cgi/tech/1458491343/

前スレ
Swift part8
http://echo.2ch.net/test/read.cgi/tech/1463149806/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0877デフォルトの名無しさん (ワッチョイ f23c-DoU+)2017/02/14(火) 23:20:32.69ID:gfvqdCIF0
>>873
これは辛い
0878デフォルトの名無しさん (ブーイモ MM52-mpSg)2017/02/14(火) 23:26:04.59ID:y+v+ZN8qM
>>875
それを誰が指示すんの?
内部のstatic変数を初期化する引数を追加して使用者に指定してもらうの?
0879デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/14(火) 23:34:45.01ID:PDBDanqwa
>>878
それは引数で渡すのか他の変数の状態に依存するのか関数を書く人次第でしょ
C言語のstatic変数使ったことないの? ググってみれば?
0880デフォルトの名無しさん (ワッチョイ 9b33-C9ZD)2017/02/15(水) 00:01:10.23ID:RQyBuwlX0
Swift界隈ではC言語を知らない人もいるのだろう
0881デフォルトの名無しさん (ワッチョイ f2c9-3OfB)2017/02/15(水) 00:05:03.84ID:98yhGEhP0
>>876
ラップされた側でさらにタプルに包んで渡さないといけないのがつらいけどこれどうにかできんかな

func wrap<T, V>(_ fn: @escaping (T) -> V) -> (T) -> V {
print("¥(T.self) -> ¥(V.self)")

var counter = 0

return { (args: T) -> V in
let mirror = Mirror(reflecting: args)
let inputs = mirror.children.count == 0 ? [args] : mirror.children.map { $0.value }
let result = fn(args)
print("¥(counter): ¥(inputs) -> ¥(result)")

counter += 1

return result
}
}

func f1(a: Int, b: String) -> String { return repeatElement(b, count: a).joined() }
let f2 = wrap(f1)
f2((5, "z"))
f2((3, "abc"))

// (Int, String) -> String
// 0: [5, "z"] -> zzzzz
// 1: [3, "abc"] -> abcabcabc
0882デフォルトの名無しさん (ワッチョイ 173c-cGUq)2017/02/15(水) 00:25:36.90ID:rlmICMnW0
>>881
http://swiftlang.ng.bluemix.net/#/repl/58a32121691eea40bd985ea3
0883デフォルトの名無しさん (ワッチョイ f2c9-3OfB)2017/02/15(水) 00:38:51.58ID:98yhGEhP0
>>882
なるほど、そうなるのか
0884デフォルトの名無しさん (ワッチョイ f23c-DoU+)2017/02/15(水) 01:03:41.72ID:WU5+o8Pm0
>>881
>>882
いいねー
ただ現状は>>873と同じで引数の数でオーバーロードしておく必要があるってことだね
0885デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/15(水) 01:43:26.08ID:5Sts5aosa
まぁ、苦労した割にはさほど実用性はないし、何より保守性が悪すぎるよね
static変数って別にカウント用途だけじゃなくて、例えば前回の状態を保持しときたい、だけどその状態を、メンバ変数として持つより、その関数だけに局所化しときたいし、クロージャを使うほど大仰でもないような時に便利なわけで
上の例みたいに回数をカウントするとか、前回の処理の成否を保持しといてリトライの制御に使ったり、メッセージ内容(何回失敗しました..)を変えたりとか、線の描画なんかで前回のクリック位置を覚えときたいとか、いろいろあるんだけど...
一番のメリットは、手軽に使えることだと思う。多用はいかんけど。
0886デフォルトの名無しさん (ワッチョイ f2c9-3OfB)2017/02/15(水) 03:34:27.80ID:98yhGEhP0
いや、そもそもメンバ変数にしたくない理由が分からんけどな
0887デフォルトの名無しさん (ワッチョイ d3c9-C9ZD)2017/02/15(水) 09:20:48.24ID:ItYgKVGf0
>>881
THX a lot.

けどclosureを引数にとって、closureを返す関数の呼び出しってのは、頭クラクラする。
0888デフォルトの名無しさん (ササクッテロリ Spf7-v7A7)2017/02/15(水) 10:01:52.43ID:er7cKMeEp
クロージャーにtypealias使えば少しは緩和されるかな
多用するものじゃないけども
0889デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/15(水) 10:19:20.68ID:cA9nAL4ta
>>886
メンバ変数だと他のメソッドから意図せず変更される可能性がある
0890デフォルトの名無しさん (ワッチョイ f23c-DoU+)2017/02/15(水) 15:21:51.64ID:WU5+o8Pm0
メンバ変数ってインスタンス変数のことで
スタティック変数ってクラス変数のことでしょ?
クロージャ使う以外に他からの変更を防ぐ手段ってあるのかな
関数のメタデータに好きな値を設定する手段でもあればできるかもだけど
0891デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/15(水) 15:40:42.82ID:nbc++MSva
>>890
上で話してるstatic変数は、クラス変数とはちょっと違う
C言語の関数内static変数のことで、性質的にはクラス変数に近いけど基本的にその関数内でしかアクセスできない
C言語由来のC++やObj-Cのメソッド内にも定義できる
0892デフォルトの名無しさん (ワッチョイ f2c9-3OfB)2017/02/15(水) 15:54:15.06ID:98yhGEhP0
>>889
他のメソッドに触られたくないとなったときに、クラスを分割するんじゃなくてstaticローカル変数でメソッドに閉じ込めたいという状況がわからない
オブジェクト指向的にはそのクラスが適切な凝集度に収まってないってことでしょ
staticローカル変数とかクロージャで状態を関数に閉じ込めてしまうとテストも難しくなる問題もある
0893デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/15(水) 16:13:28.40ID:nbc++MSva
>>892
状況って改まって言われてもあれだけど、クラスの属性とするほどもない一時的な値を保持しときたい時とかかなぁ

例えば整数の並びを読み込みながら、直前に読み込んだ値との差を表示する処理があったとして、
func printDiffernce() {
 static var prevValue: Int

 if let curValue = self.getNextValue() {
  print("difference = ¥(curValue - prevValue)")
  prevValue = curValue
 } else {
  prevValue = 0
 }
}

みたいな書き方ができれば便利じゃね?
個人的にSwiftにはスクリプト言語的な手軽さも期待してるんで、やっつけ仕事とかだと重宝すると思うんだけどね
0894デフォルトの名無しさん (ワッチョイ f23c-DoU+)2017/02/15(水) 17:54:12.90ID:WU5+o8Pm0
>>891
自分が主に使ってきた言語でそういうのなかったから使ったことなかったわ
C++とObj-Cを除くとCのstatic local変数が実装されてるのはVB.NETくらいみたいね
0895デフォルトの名無しさん (ワッチョイ f23c-DoU+)2017/02/15(水) 18:05:13.29ID:WU5+o8Pm0
>>893
こういうので我慢してはどうだろうか?

func printDiffernce() {
struct Prev { static var value: Int? }

let curValue = getNextValue()
if let prevValue = Prev.value {
print("difference = ¥(curValue - prevValue)")
Prev.value = curValue
} else {
Prev.value = curValue
}
}

自分ならインスタンス変数使うけど
0896デフォルトの名無しさん (アウアウエー Sa4a-C9ZD)2017/02/15(水) 18:26:07.27ID:nbc++MSva
>>895
一番お手軽な代替だけと無理やり感は否めないね
自分もそこまでやるなら素直にインスタンス変数使うわ
0897デフォルトの名無しさん (ワッチョイ f2c9-3OfB)2017/02/15(水) 18:38:47.57ID:98yhGEhP0
struct S {
func foo() {
struct T { static var count = 0 }
print(T.count)
T.count += 1
}
}

let s1 = S()
s1.foo()
s1.foo()
s1.foo()

let s2 = S()
s2.foo()
s2.foo()
s2.foo()

これで"0 1 2 0 1 2"を期待するか"0 1 2 3 4 5"を期待するか
読みやすいと思うか読みにくいと思うか
人によって違うだろうしstaticローカル変数があったとしても混乱の元でしかないようなきがする
0898デフォルトの名無しさん (スフッ Sd52-S0So)2017/02/15(水) 18:47:02.04ID:ngDNeO3Hd
>>891
インラインCで書けないの?
0899デフォルトの名無しさん (スップ Sd52-ogAn)2017/02/15(水) 18:57:43.93ID:Ngm4n4Trd
>>898
without Cなモダンな言語SwiftでインラインのCなんか許されるわけねぇだろ
0900デフォルトの名無しさん (ササクッテロラ Spf7-C9ZD)2017/02/15(水) 19:48:47.19ID:Whvl4rVxp
>>897
そこは仕様を理解した上での使用ならいいのではという気がする
実際C++での振る舞いも同じだし、staticなんだからそれでいいだろうと
今までC言語で使ってた人には違和感はないでしょ
まぁSwiftは、曖昧でわかりにくい挙動は廃止の方向で動いてるっぽいからSwiftに組み込まれる可能性は低いだろうけど
0901デフォルトの名無しさん (ワッチョイ 9b33-ogAn)2017/02/15(水) 19:57:33.26ID:RQyBuwlX0
至高の言語Swift
0902デフォルトの名無しさん (スフッ Sd7f-yXFx)2017/02/16(木) 09:38:14.22ID:y1APn5Gud
ま、関数がローカルでスタティックな変数なんて持つと
再入不能になって、並列化が困難になるから
モダンじゃないよな
0903デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 10:04:42.21ID:4SRfHRZm0
>>902
なるほどぉ。

けど、そこはプログラマーを信頼して、static varできるfuncを許容するってのも選択肢かも。
0904デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 10:21:22.38ID:4SRfHRZm0
SwiftSR-3941
AffineTransform.rotate(byRadians:) can be wrong

まったくActivityが無いなぁ。まずいなぁ。
0905デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/16(木) 11:17:17.48ID:3C0NPS0ia
関数内スタティック変数が危険で、インスタンス変数やクラス変数は安全って理論が分からん
インスンタンス間で共有される点では危険かもしれんが、それはクラス変数も同じだろ
スコープの認識で誤解を生む可能性が高いという点では同意するが
0906デフォルトの名無しさん (スフッ Sd7f-yXFx)2017/02/16(木) 12:10:38.93ID:y1APn5Gud
>>905
そういった話はPOSIX4にでも言ってくれ
何年も前に結論が出てるから遅きに失した感はあるけど
0907デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 12:40:38.73ID:4SRfHRZm0
>>906
POSIXってなんて発音してる?
ポジックス
ホジックス
ポシックス
どちらでしょう?

どこぞでJavaScriptをジャバスクって読んで炎上してました。
0908デフォルトの名無しさん (スップ Sd7f-PET2)2017/02/16(木) 13:30:20.81ID:QNa2K6exd
>>907
どう読んでもホジックスねーだろ
勝手にホジッてろ
0909デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 14:04:26.99ID:4SRfHRZm0
じゃぁC++はどう発音すべきでしょう。
ちなみに、僕は
シィープラプラ
って言ってました。

やっぱり
シィープラスプラス
って言うべきでしょうかねぇ?
0910デフォルトの名無しさん (JP 0H1f-3aUF)2017/02/16(木) 14:20:18.92ID:1VBkG9E6H
たすたす
0911デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 14:39:47.25ID:4SRfHRZm0
>>910
外人さんの発音を真似る事にします。
C++ = シープラスプラッス
JavaScript = ジャバスクリット
Swift = スイット

どうやらp, fって発音しないのかな?
0912デフォルトの名無しさん (ワッチョイ 3b3c-fFgi)2017/02/16(木) 15:20:54.37ID:dgGiwFPU0
>>911
p発音しないんか!

Pascal = アスカル
Python = ワイソン
0913デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/16(木) 15:41:59.99ID:4SRfHRZm0
>>912
母音のあとのpは発音しない。
ip -> i
0914デフォルトの名無しさん (ワッチョイ 0b4e-N9BQ)2017/02/16(木) 15:46:25.71ID:fb6O/m5X0
プラッチック
0915デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/16(木) 15:48:25.74ID:zitEQFpsa
https://www.youtube.com/watch?v=vcO1QG-Pm3Y
https://www.youtube.com/watch?v=CdN-hZIq7p8
https://www.youtube.com/watch?v=jXHnq36i-mA

聞き取れないなら耳がおかしい
0916デフォルトの名無しさん (JP 0H1f-3aUF)2017/02/16(木) 16:47:34.10ID:1VBkG9E6H
apfel
0917デフォルトの名無しさん (ワッチョイ 5f3c-Scgb)2017/02/16(木) 16:56:45.12ID:Om/f1qwp0
>>913
そんなルールないでしょ
文末だったり次が子音の時に唇を閉じるだけで空気を吐き出さない人もいるから
それが音として聞き取れてないだけだと思うぞ
https://www.youtube.com/watch?v=JPUr5MgeDHM&;start=103
0918デフォルトの名無しさん (ワッチョイ 5f85-eq+O)2017/02/16(木) 16:58:53.36ID:Cc78fshD0
外人外人って
おまえらどこの国の発音を想定してるの?
0919デフォルトの名無しさん (ワッチョイ 3b3c-Dr1I)2017/02/16(木) 18:11:32.30ID:164TOoVr0
ジパング
0920デフォルトの名無しさん (ワッチョイ eb33-ykbm)2017/02/17(金) 03:44:46.12ID:7wkNsQja0
至高の言語Swift
0921デフォルトの名無しさん (ササクッテロリ Sp9f-X9Uf)2017/02/17(金) 08:02:46.95ID:3FtIr36Jp
究極の言語Objective-C
0922デフォルトの名無しさん (スプッッ Sd7f-PET2)2017/02/17(金) 09:53:10.86ID:aT4GW3VEd
極上の言語swift
0923デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 10:02:21.81ID:Akp7bstt0
100個のInt要素を格納した配列2個の内積を計算するとします。
let a: [Int] = Array(repeating: 1, count: 100)
let b: [Int] = Array(repeating: 10, count: 100)
a, bの内積をFoundationモジュールのThreadクラスを使って4つのスレッドを生成して計算するコードは、どんな具合になるのでしょう?

どなたか、適当なサンプルを紹介してください。
0924デフォルトの名無しさん (ササクッテロラ Sp9f-BRgT)2017/02/17(金) 10:31:37.24ID:0upCUQyEp
丸投げすんな
まず自分で考えたコードを示してどこで躓いてるかを質問しろ
0925デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 11:17:40.03ID:Akp7bstt0
>>924
いや、ごもっとも。
DispatchQueueやOperationを使った例は見つかるのに、Threadを使った例が見つからないんですよ。

前者2つは、生成スレッドの数をSystem側が制御するのが気にくわないです。
そこでPOSIX Threadを使いたいのですが、どうやってjoinするのか?
API Documentを見てもよく判らずお尋ねしたしだいです。
0926デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 11:19:41.97ID:Akp7bstt0
もうすぐ安価の8Core CPUが販売(AMD Ryzen to be launched in 2 March)されるのに、Threadの数をSystem側に制御されちゃうのも嫌だなぁと思って。
0927デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/17(金) 11:27:15.67ID:EBBNx7lQa
これ読め

https://developer.apple.com/jp/documentation/Multithreading.pdf
0928デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/17(金) 11:43:43.16ID:Ev3rlX/U0
vDSP使おう
0929デフォルトの名無しさん (ササクッテロリ Sp9f-X9Uf)2017/02/17(金) 12:41:49.31ID:zNlklL+qp
>>925がgoを学んだら発狂しそうww
イマドキSystem任せにしない方が不安定だろうに、大学の課題か何かかな
0930デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 13:16:03.93ID:Akp7bstt0
>>929
RubyのコードをSwiftに移植しようとしてます。

Mutexを使ってクリティカルセクションを設定したり、走り始めたThreadを待ち合わせるのはSwiftのFoundationモジュールのThreadクラスでどうするのかなぁ?と
思ってお尋ねした次第です。
0931デフォルトの名無しさん (スプッッ Sd7f-PET2)2017/02/17(金) 13:18:54.00ID:aT4GW3VEd
老がいってやつかにゃ
0932デフォルトの名無しさん (スフッ Sd7f-yXFx)2017/02/17(金) 13:27:17.49ID:g7uCN/FDd
>>925
ThreadクラスもPスレッドも非推奨だから仕方がない
まずはOpeationQueueあたり使って見たら?
もちろん使用するスレッド数も制御できるよ

推奨の方法でどうしてもダメな理由が出てきてから
ThreadクラスやPスレッドに手を出したらいい
0933デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/17(金) 13:33:47.11ID:zATlaFwqa
>>930

>>927の29ページ読んだか?
0934デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 14:20:38.36ID:Akp7bstt0
>>932
>>933

THX a lot
色々読んで、修行します。
0935デフォルトの名無しさん (ワッチョイ 8bc9-ykbm)2017/02/17(金) 14:28:58.70ID:Akp7bstt0
>>931
はい、大当たり。
老害エンジニアです。
0936デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/17(金) 18:25:26.76ID:Ev3rlX/U0
Swift 4 Release Process
https://swift.org/blog/swift-4-0-release-process/
0937デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/17(金) 19:22:45.52ID:FaJoTYRf0
Application Binary Interface (ABI)
の安定化が最優先課題だって。
0938デフォルトの名無しさん (ワッチョイ 6b7b-ea4t)2017/02/17(金) 19:26:10.74ID:nctM8eJ40
ruby扱ってるなら30行くか行かないかの小僧だろ・・・
老害に至る以前の世間知らずだにゃー
0939デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/17(金) 21:58:24.45ID:FaJoTYRf0
String Processing For Swift 4
Swift4ではString周りが大改革されるって。

現状のIndexを使った文字列アクセスは、なんかしっくりこなかったんだよなぁ。直感的では無かったし、やっぱり文字列は整数を使ってアクセスできなきゃダメだワサァ。
0940デフォルトの名無しさん (ワッチョイ fb17-yXFx)2017/02/17(金) 22:02:19.90ID:gUVhRjes0
仕様が落ち着いたら起こしてくれ
0941デフォルトの名無しさん (ワッチョイ 3b3c-eq+O)2017/02/17(金) 22:20:48.18ID:uN4QBy3G0
それが彼の最期の言葉だった
0942デフォルトの名無しさん (ワッチョイ eb33-MFap)2017/02/17(金) 22:39:06.54ID:7wkNsQja0
それは私の課題ではありません
0943デフォルトの名無しさん (ワッチョイ 5f3c-extS)2017/02/18(土) 00:59:35.29ID:OUHo6iYG0
文字列処理って言語の肝じゃん。
破壊的な変更入れていいものかねぇ。
0944デフォルトの名無しさん (ワッチョイ 0fba-PET2)2017/02/18(土) 01:13:55.79ID:3KSwEFyS0
言語バージョン対応という仕事を作ってくれるswift
0945デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 01:17:55.48ID:rKwnwDJ5a
内部コードを今さらUTF16にするとか言わんよな
0946デフォルトの名無しさん (ワッチョイ 6b7b-ea4t)2017/02/18(土) 07:40:22.96ID:XfVC26Fr0
文字列の扱いなんてbetaから1.xの頃って半年に一回破壊変更あったし大丈夫、大丈夫
それを笑い飛ばせないSwift使いなんているわけない
0947デフォルトの名無しさん (ワッチョイ eb33-MFap)2017/02/18(土) 07:51:02.96ID:KOOSHa+W0
至高の言語Swift
0948デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/18(土) 09:32:42.49ID:bxFvL8ai0
JavaScriptも毎年変更されてるから、最近はどこも、そんな感じなんだろう。

ECMA2015, 2016, 2017
0949デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/18(土) 09:34:20.94ID:bxFvL8ai0
>>945
それは無い。
Unicode界隈はUTF-8で落ち着いている。
絵文字の増加が毎年の話題で、大した話では無い。
0950デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 10:20:12.36ID:wNEbwMAxa
Swiftの文字列の内部コードはユニコードスカラー値って書いてあったんだが
0951デフォルトの名無しさん (ワッチョイ df93-yXFx)2017/02/18(土) 10:29:13.37ID:CZJbBrsK0
>>950
それを言うなら文字列の内部表現を想定しちゃいけないと書いてあるだろ

NSStringを与えて作ったStrungの内部表現はNSStringになって、
そうじゃない場合内部表現はユニコードスカラーになったり、
他の文字列への参照になったりするわけだから
0952デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 10:54:09.73ID:wNEbwMAxa
想定するも何も想定しようがないんだが
0953デフォルトの名無しさん (ワッチョイ db3c-yXFx)2017/02/18(土) 11:41:47.59ID:NSF889Ks0
import UIKit
import AVFoundation

class ViewController: UIViewController,
AVAudioPlayerDelegate {

var audioPlayer:AVAudioPlayer!

@IBOutlet var button:UIButton!

override func viewDidLoad() {
super.viewDidLoad()

// 再生する audio ファイルのパスを取得
let audioPath = Bundle.main.path(forResource: "sample", ofType:"m4r")!
let audioUrl = URL(fileURLWithPath: audioPath)

// auido を再生するプレイヤーを作成する
var audioError:NSError?
do {
audioPlayer = try AVAudioPlayer
(contentsOf: audioUrl)
}
catch let error as NSError {
audioError = error
audioPlayer = nil
}
0954デフォルトの名無しさん (ワッチョイ db3c-yXFx)2017/02/18(土) 11:44:02.26ID:NSF889Ks0
>>953
// エラーが起きたとき
if let error = audioError {
print("Error \(error.localizedDescription)"
)
}
audioPlayer.delegate = self
audioPlayer.prepareToPlay ()
}
// ボタンがタップされた時の処理
@IBAction func button(_ sender: AnyObject
) {
if ( audioPlayer.isPlaying ){
audioPlayer.stop()
button.setTitle("Stop", for: UIControlState
())
}
else{
audioPlayer.play()
button.setTitle("Play", for: UIControlState
())
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
ボタンを押すと音がなるアプリを作りたくて上記のコードで実行してみたんだけど「SIGABRT」「NSInvalidArgumentException」「unrecognized selector sent to instance」
こんなエラーが出る
初心者でおかしな質問してるかもしれない
もしよかったらどこを直せばいいか教えてほしい
0955デフォルトの名無しさん (スップ Sd7f-MFap)2017/02/18(土) 12:00:29.34ID:yNmDyf4Id
至極の言語Swift
0956デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/18(土) 12:43:28.88ID:ss3TDen/0
SwiftのStringの内部表現はこれと決まってるわけではないが、今のところASCIIかUTF-16かNSStringのラッパー

「内部コード」が「内部表現」ではなく「何を文字とするか」ならCharacterはユニコードのextended grapheme clusterで、各種文字列操作もそれに準じるのはSwift4前後でも変わらない

>>949
UTF-8で落ち着いてるというのはファイルのエンコーディングの話
ファイルのエンコーディングなら持ち回しやすさを考えてデータサイズが小さくてバイトオーダーを考慮しなくていいUTF-8が主流だし、
言語やOSの内部表現なら(サロゲートはあるが一応/昔は)固定長でUTF-32ほどは大きくないUTF-16が主流

>>950
どこ?
0957デフォルトの名無しさん (ササクッテロラ Sp9f-ykbm)2017/02/18(土) 12:54:59.38ID:c9HMTA6gp
>>956

AppleのSwift本(The Swift Programming Language)に

Behind the scenes, Swift's native String type is build from Unicode scalar values.

って書いてある
0958デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/18(土) 13:57:57.19ID:bxFvL8ai0
>>957
Either utf-8, utf-16 or even utf-32 is made from Unicode scalar values, aka Unicode Code Point.
0959デフォルトの名無しさん (ワッチョイ 3b3c-eq+O)2017/02/18(土) 13:58:35.10ID:oLH7rESg0
Swift3のStringの内部表現は_StringCoreが保持していて
ASCIIのみの場合はASCII、それ以外が含まれるとUTF16に切り替わる
NSStringはUTF16

>>954
エラーが起きたらまずエラーメッセージでググれ
0960デフォルトの名無しさん (ワッチョイ eb46-MFap)2017/02/18(土) 14:00:54.45ID:zBLDkUJj0
人類史上最強のモダン言語Swift
0961デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/18(土) 14:10:33.53ID:ss3TDen/0
>>957
それはたぶんユニコードスカラーリテラルのことを言ってるんじゃないの


普通のStringは実装が_StringCoreで
https://github.com/apple/swift/blob/master/stdlib/public/core/StringCore.swift

_StringCoreの中のバッファは以下の3つどれかが選ばれて
public var asciiBuffer: UnsafeMutableBufferPointer<UTF8.CodeUnit>?
public var nativeBuffer: _StringBuffer?
public var cocoaBuffer: _CocoaString?

NSString由来じゃなくASCIIに収まらないなら_StringBufferが使われて、_StringBufferはUTF16
https://github.com/apple/swift/blob/master/stdlib/public/core/StringBuffer.swift

C文字列から作る系は全部_StringBufferにデコードされる
https://github.com/apple/swift/blob/master/stdlib/public/core/CString.swift

StaticStringはASCIIかUTF8か単一のUnicodeScalar
https://github.com/apple/swift/blob/master/stdlib/public/core/StaticString.swift
0962デフォルトの名無しさん (ワッチョイ dfa6-ea4t)2017/02/18(土) 14:14:39.39ID:YlQzCJd/0
>>953
>>954
ストリーボードにあなたが貼り付けたボタンを右クリックしてみて
でてきた画面の中に定義されてない関数があるはずだからそれを消せばOK
0963デフォルトの名無しさん (ワッチョイ 8b5b-fFgi)2017/02/18(土) 14:16:47.01ID:bxFvL8ai0
>>961
あんた凄いなぁ。
俺なんか、Unsafe族が現れたら、クラクラしてきて戦意喪失。
0964デフォルトの名無しさん (ワッチョイ 5f3c-Scgb)2017/02/18(土) 15:30:42.50ID:yZwtGkz90
>>954
「unrecognized selector sent to instance」の後にそのselectorの名前が書いてあると思うからそこを修正すればいい
>>962の人が書いてくれてるみたいにIBOutlet/IBActionの接続が上手くできてない(リネームしたりするとよくある)
あとどうでもいいけどPlayとStopのボタンタイトルの設定が逆
0965デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 16:18:43.63ID:wVqfoazIa
>>961
ASCII文字列に、非ASCIIキャラをinsertした後の文字列はどうなるの?

var asciiString: Sting = ...
asciiString.insert("あ", at: s.startIndex)
0966デフォルトの名無しさん (ワッチョイ 3b3c-eq+O)2017/02/18(土) 17:48:34.42ID:oLH7rESg0
UTF16になる
0967デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 18:03:13.63ID:wVqfoazIa
で、非ASCII文字を削除したら、またUTF8に戻るの?

asciiString.remove(at: s.startIndex)

これ毎回チェックしてるとしたら結構なオーバーヘッドな気が...
0968デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/18(土) 20:08:14.30ID:ss3TDen/0
s._core.isASCII で見れるよ
0969デフォルトの名無しさん (ササクッテロラ Sp9f-ykbm)2017/02/18(土) 20:49:34.59ID:c9HMTA6gp
非ASCII文字を削除した後の _core.isASCII がfalseって事は、
一旦UTF16にしたらもう、UTF8に戻さないって事?
0970デフォルトの名無しさん (ワッチョイ 0fba-PET2)2017/02/18(土) 21:11:09.55ID:3KSwEFyS0
よくわからんポリシーやな
0971デフォルトの名無しさん (ワッチョイ df93-yXFx)2017/02/18(土) 21:11:54.83ID:CZJbBrsK0
>>969
実行効率を良くするために
元がASCIIならASCIIのまま、元がNSStringならNSStringのまま扱うわけであって
一度ネイティヴに変換したものを元の形式に戻す意味はないだろ?

で、そこらへんの細かいことはコンパイラとライブラリーに任せて
アプリケーションプログラマーには自分のロジック書くのに集中して欲しいから
内部表現を想定するなって事になってるんだと思うよ
0972デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 21:50:54.42ID:HBZdFR5pa
内部表現を想定するって例えばどういう事だろ
許可されてるインフェースを通してしかアクセスできないんだから
想定しようにもできない気がするけど
0973デフォルトの名無しさん (ワッチョイ 5fc9-fFgi)2017/02/18(土) 22:29:50.36ID:ss3TDen/0
コピーオンライトとかでバッファを作り直すときにはasciiだけかどうかチェックして作り直すみたい

var s = "あabc" // sはutf16
s.remove(at: s.startIndex) // sはutf16のまま
var t = s // tはsと同じバッファを参照
t.remove(at: t.startIndex) // コピーオンライトが働いてtがasciiで作り直される


>>972
バイト列を直接操作したいとか、utf8のファイルを読み込むときにいちいち内部表現への変換が走ってほしくないとか?
多分そういうのを想定してString Processing For Swift 4で内部表現を明示的に指定できるUTF8Stringみたいな型も使えるようにするって言ってるんだと思う
まぁ現時点ではほとんどまったく意味ないね
0974デフォルトの名無しさん (ワッチョイ 3b3c-eq+O)2017/02/18(土) 22:31:20.54ID:oLH7rESg0
>>972
それは順序が逆で
想定すべきでないという設計思想がまずあって、その結果今のインターフェイスがある

ただし次は特に高速が求められるケースでは特定の内部表現を前提に出来るようになる予定
0975デフォルトの名無しさん (スフッ Sd7f-yXFx)2017/02/18(土) 23:03:24.02ID:KQ+hCWpkd
>>972
a...zでアルファベット全部が表現できる(無意識にascii系とかを想定、少なくともebsdicではない)

"あい"文字列の"い"を取り出すには4文字目から取り出さなきゃ(無意識にutf8を想定)

アルファベットで100万文字だから1MByteでお釣りがくるぜ(無意識に8bit系を想定)

文字コード値22FFFFを代入する(無意識にUCS4を想定)

てな感じ
どちらかと言うと今までは文字コードの想定を置かないとブログラムを書けない言語が主流だったから
swiftの文字列に対するインターフェースはまどろこしく感じちゃうよね
0976デフォルトの名無しさん (アウアウエー Sa7f-ykbm)2017/02/18(土) 23:26:41.42ID:HBZdFR5pa
>>975
何かの勘違いでそういう想定(今時EBSDICを想定する奴はいないと思うけど)したとしても、
Sting内部に直接アクセスできないんだから、間違えようがない気がするんだけど、
UnsafePointer系の操作で出来ちゃったりするのかな
UnicodeScalarとか名前から明らかなとこにJISコード入れちゃうとかはそれ以前の問題だし
レス数が950を超えています。1000を超えると書き込みができなくなります。