■ このスレッドは過去ログ倉庫に格納されています
Swift part9
- 1 :デフォルトの名無しさん(ワッチョイ 8b3c-/6Y/):2016/10/18(火) 11:34:44.16 ID:oLo879ze0.net
- 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
- 951 :デフォルトの名無しさん (ワッチョイ df93-yXFx):2017/02/18(土) 10:29:13.37 ID:CZJbBrsK0.net
- >>950
それを言うなら文字列の内部表現を想定しちゃいけないと書いてあるだろ
NSStringを与えて作ったStrungの内部表現はNSStringになって、
そうじゃない場合内部表現はユニコードスカラーになったり、
他の文字列への参照になったりするわけだから
- 952 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 10:54:09.73 ID:wNEbwMAxa.net
- 想定するも何も想定しようがないんだが
- 953 :デフォルトの名無しさん (ワッチョイ db3c-yXFx):2017/02/18(土) 11:41:47.59 ID:NSF889Ks0.net
- 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
}
- 954 :デフォルトの名無しさん (ワッチョイ db3c-yXFx):2017/02/18(土) 11:44:02.26 ID:NSF889Ks0.net
- >>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」
こんなエラーが出る
初心者でおかしな質問してるかもしれない
もしよかったらどこを直せばいいか教えてほしい
- 955 :デフォルトの名無しさん (スップ Sd7f-MFap):2017/02/18(土) 12:00:29.34 ID:yNmDyf4Id.net
- 至極の言語Swift
- 956 :デフォルトの名無しさん (ワッチョイ 5fc9-fFgi):2017/02/18(土) 12:43:28.88 ID:ss3TDen/0.net
- SwiftのStringの内部表現はこれと決まってるわけではないが、今のところASCIIかUTF-16かNSStringのラッパー
「内部コード」が「内部表現」ではなく「何を文字とするか」ならCharacterはユニコードのextended grapheme clusterで、各種文字列操作もそれに準じるのはSwift4前後でも変わらない
>>949
UTF-8で落ち着いてるというのはファイルのエンコーディングの話
ファイルのエンコーディングなら持ち回しやすさを考えてデータサイズが小さくてバイトオーダーを考慮しなくていいUTF-8が主流だし、
言語やOSの内部表現なら(サロゲートはあるが一応/昔は)固定長でUTF-32ほどは大きくないUTF-16が主流
>>950
どこ?
- 957 :デフォルトの名無しさん (ササクッテロラ Sp9f-ykbm):2017/02/18(土) 12:54:59.38 ID:c9HMTA6gp.net
- >>956
AppleのSwift本(The Swift Programming Language)に
Behind the scenes, Swift's native String type is build from Unicode scalar values.
って書いてある
- 958 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/18(土) 13:57:57.19 ID:bxFvL8ai0.net
- >>957
Either utf-8, utf-16 or even utf-32 is made from Unicode scalar values, aka Unicode Code Point.
- 959 :デフォルトの名無しさん (ワッチョイ 3b3c-eq+O):2017/02/18(土) 13:58:35.10 ID:oLH7rESg0.net
- Swift3のStringの内部表現は_StringCoreが保持していて
ASCIIのみの場合はASCII、それ以外が含まれるとUTF16に切り替わる
NSStringはUTF16
>>954
エラーが起きたらまずエラーメッセージでググれ
- 960 :デフォルトの名無しさん (ワッチョイ eb46-MFap):2017/02/18(土) 14:00:54.45 ID:zBLDkUJj0.net
- 人類史上最強のモダン言語Swift
- 961 :デフォルトの名無しさん (ワッチョイ 5fc9-fFgi):2017/02/18(土) 14:10:33.53 ID:ss3TDen/0.net
- >>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
- 962 :デフォルトの名無しさん (ワッチョイ dfa6-ea4t):2017/02/18(土) 14:14:39.39 ID:YlQzCJd/0.net
- >>953
>>954
ストリーボードにあなたが貼り付けたボタンを右クリックしてみて
でてきた画面の中に定義されてない関数があるはずだからそれを消せばOK
- 963 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/18(土) 14:16:47.01 ID:bxFvL8ai0.net
- >>961
あんた凄いなぁ。
俺なんか、Unsafe族が現れたら、クラクラしてきて戦意喪失。
- 964 :デフォルトの名無しさん (ワッチョイ 5f3c-Scgb):2017/02/18(土) 15:30:42.50 ID:yZwtGkz90.net
- >>954
「unrecognized selector sent to instance」の後にそのselectorの名前が書いてあると思うからそこを修正すればいい
>>962の人が書いてくれてるみたいにIBOutlet/IBActionの接続が上手くできてない(リネームしたりするとよくある)
あとどうでもいいけどPlayとStopのボタンタイトルの設定が逆
- 965 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 16:18:43.63 ID:wVqfoazIa.net
- >>961
ASCII文字列に、非ASCIIキャラをinsertした後の文字列はどうなるの?
var asciiString: Sting = ...
asciiString.insert("あ", at: s.startIndex)
- 966 :デフォルトの名無しさん (ワッチョイ 3b3c-eq+O):2017/02/18(土) 17:48:34.42 ID:oLH7rESg0.net
- UTF16になる
- 967 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 18:03:13.63 ID:wVqfoazIa.net
- で、非ASCII文字を削除したら、またUTF8に戻るの?
asciiString.remove(at: s.startIndex)
これ毎回チェックしてるとしたら結構なオーバーヘッドな気が...
- 968 :デフォルトの名無しさん (ワッチョイ 5fc9-fFgi):2017/02/18(土) 20:08:14.30 ID:ss3TDen/0.net
- s._core.isASCII で見れるよ
- 969 :デフォルトの名無しさん (ササクッテロラ Sp9f-ykbm):2017/02/18(土) 20:49:34.59 ID:c9HMTA6gp.net
- 非ASCII文字を削除した後の _core.isASCII がfalseって事は、
一旦UTF16にしたらもう、UTF8に戻さないって事?
- 970 :デフォルトの名無しさん (ワッチョイ 0fba-PET2):2017/02/18(土) 21:11:09.55 ID:3KSwEFyS0.net
- よくわからんポリシーやな
- 971 :デフォルトの名無しさん (ワッチョイ df93-yXFx):2017/02/18(土) 21:11:54.83 ID:CZJbBrsK0.net
- >>969
実行効率を良くするために
元がASCIIならASCIIのまま、元がNSStringならNSStringのまま扱うわけであって
一度ネイティヴに変換したものを元の形式に戻す意味はないだろ?
で、そこらへんの細かいことはコンパイラとライブラリーに任せて
アプリケーションプログラマーには自分のロジック書くのに集中して欲しいから
内部表現を想定するなって事になってるんだと思うよ
- 972 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 21:50:54.42 ID:HBZdFR5pa.net
- 内部表現を想定するって例えばどういう事だろ
許可されてるインフェースを通してしかアクセスできないんだから
想定しようにもできない気がするけど
- 973 :デフォルトの名無しさん (ワッチョイ 5fc9-fFgi):2017/02/18(土) 22:29:50.36 ID:ss3TDen/0.net
- コピーオンライトとかでバッファを作り直すときには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みたいな型も使えるようにするって言ってるんだと思う
まぁ現時点ではほとんどまったく意味ないね
- 974 :デフォルトの名無しさん (ワッチョイ 3b3c-eq+O):2017/02/18(土) 22:31:20.54 ID:oLH7rESg0.net
- >>972
それは順序が逆で
想定すべきでないという設計思想がまずあって、その結果今のインターフェイスがある
ただし次は特に高速が求められるケースでは特定の内部表現を前提に出来るようになる予定
- 975 :デフォルトの名無しさん (スフッ Sd7f-yXFx):2017/02/18(土) 23:03:24.02 ID:KQ+hCWpkd.net
- >>972
a...zでアルファベット全部が表現できる(無意識にascii系とかを想定、少なくともebsdicではない)
"あい"文字列の"い"を取り出すには4文字目から取り出さなきゃ(無意識にutf8を想定)
アルファベットで100万文字だから1MByteでお釣りがくるぜ(無意識に8bit系を想定)
文字コード値22FFFFを代入する(無意識にUCS4を想定)
てな感じ
どちらかと言うと今までは文字コードの想定を置かないとブログラムを書けない言語が主流だったから
swiftの文字列に対するインターフェースはまどろこしく感じちゃうよね
- 976 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 23:26:41.42 ID:HBZdFR5pa.net
- >>975
何かの勘違いでそういう想定(今時EBSDICを想定する奴はいないと思うけど)したとしても、
Sting内部に直接アクセスできないんだから、間違えようがない気がするんだけど、
UnsafePointer系の操作で出来ちゃったりするのかな
UnicodeScalarとか名前から明らかなとこにJISコード入れちゃうとかはそれ以前の問題だし
- 977 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/18(土) 23:31:01.65 ID:HBZdFR5pa.net
- それとも、こういう想定はダメよってこと?
for ch in 0..<26 {
let s = String(format: "%c", ch+65)
print(s)
}
- 978 :デフォルトの名無しさん (スフッ Sd7f-yXFx):2017/02/18(土) 23:42:15.42 ID:KQ+hCWpkd.net
- >>976
うん、少し前の人が書いてくれているように
内部表現とインターフェースを出来るだけ切り離すように設計されてるからね
実際には
アルファベット10文字が
10バイト+アルファになるか
20バイト+アルファになるか
40バイト+アルファになるか
を考えちゃいけない
ってくらいかな?
- 979 :デフォルトの名無しさん (ワッチョイ eb46-MFap):2017/02/19(日) 00:13:39.56 ID:vGTXfdrY0.net
- モダンすぎる言語Swift
- 980 :デフォルトの名無しさん (ササクッテロロ Sp9f-yXFx):2017/02/19(日) 10:00:43.72 ID:x1LhCX3Ip.net
- 【@1000000】
【A10】【B100】【C1000】
はじめに@で数字を設定
A〜Cのボタンを押すとその数字だけ@の数字がマイナスされていく
というアプリを作りたいのですが難しいですか?
今まではおみくじアプリや姓名診断アプリしか作ったことがないです
- 981 :デフォルトの名無しさん (スフッ Sd7f-yXFx):2017/02/19(日) 10:34:46.00 ID:h/cJOvo9d.net
- >>980
お前さんの持ってるスキルによる
手慣れた人なら10分でとりあえず動くところまでは作れる
- 982 :デフォルトの名無しさん (ワッチョイ eb46-MFap):2017/02/19(日) 11:10:03.05 ID:vGTXfdrY0.net
- プログラミング史上最強にエレガントでモダンな言語Swiftならおちゃのこさいさいよ
- 983 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 11:23:30.70 ID:w9YkVXBS0.net
- >>982
Visual Studio + C#の方がDesktopアプリは作りやすいよ。
FormにGUI部品を貼り付けただけで、イベントハンドラーがコードに現れる。
Xcode + Swiftも良いと思うよ!
- 984 :デフォルトの名無しさん (ワッチョイ eb46-MFap):2017/02/19(日) 11:29:31.80 ID:vGTXfdrY0.net
- >>983
うん、知ってる
でも最強なんだよ
なんと言ってもApple様御用達の肝入りの言語なんだから
他者の追随を許さない最もエレガントでモダンな言語であることに揺るぎはないのです
- 985 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 21:30:02.48 ID:nebqvmdd0.net
- String.Encoding構造体のメンバに関してAPI Referenceに記述が見つからない。
見つけられないのは俺だけ?
勘で、.utf8ってメンバを想定して、動いてるけど、他にどんなメンバがあるのか気になる。
- 986 :デフォルトの名無しさん (ワッチョイ df93-yXFx):2017/02/19(日) 22:01:23.21 ID:xeFgM7Gv0.net
- >>985
Swift側じゃなくってObjectiv-C側を読むんだよ
あのAPIリファレンスはときどきそう言うのがある
- 987 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 22:22:31.19 ID:nebqvmdd0.net
- >>986
ん?どう言う事?
String構造体ってのはSwiftにしかないので、Obj-C側ってことは、
NSStringのAPI Referenceを見ろって事?
typedef NSUInteger NSStringEncoding;
ってのがあって、NSUTF8StringEncoding = 4らしいんだけど、
これは、String.Encoding構造体とは違うよねぇ。
- 988 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/19(日) 22:22:46.88 ID:y9mVagiha.net
- >>985
ソースみればいいじゃん
Sting.Encodingを右クリックして、「Jump to Definition」を選べばいい
- 989 :デフォルトの名無しさん (アウアウエー Sa7f-ykbm):2017/02/19(日) 22:25:33.01 ID:y9mVagiha.net
- あれ、String.Encodingじゃダメか
String.Encoding.utf8の部分を右クリックすればいける
それか、Option押しながらクリックして、String.Encodingのヘルプ見てもいいけど
- 990 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 22:28:05.19 ID:nebqvmdd0.net
- var out: String = String(data:data, encoding: .utf8)!
out = String(data:data, encoding: .ascii)!
out = String(data:data, encoding: .shiftJIS)!
確かに、NSStringEncodingのAPI Referenceが参考にはなる。
あんがと!
- 991 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 22:30:35.66 ID:nebqvmdd0.net
- まあ、俺はmacOS使ってるけど、uBuntuの人は
String.Encodingどうすんだ?
- 992 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 22:34:36.24 ID:nebqvmdd0.net
- out = String(data:data, encoding: String.Encoding(rawValue:4))!
なんと、NSStringEncodingをAPI Referenceで調べて、
こいつはNSIntegerなので、エンコードの番号をrawValueで指定
するっていう、大変な事をする事でもOKだ。
- 993 :デフォルトの名無しさん (ワッチョイ 8b5b-fFgi):2017/02/19(日) 23:00:02.23 ID:nebqvmdd0.net
- なんと、DashでStringを引いた結果と
XcodeのAPI ReferenceでStringを引いた結果が違う事に気がついた。
特にNested Typeの所が違う。
Xcodeは8.2, Dashは3.4.2だけど、Xcodeは最新版では無いなぁ。
- 994 :デフォルトの名無しさん (ワッチョイ 0f7b-TuOZ):2017/02/20(月) 00:50:56.72 ID:mClGTBrk0.net
- 最近のUbuntuだけは、4バイト文字(サロゲートペア)を1文字と数えるらしい
他のOS, Java などでは、2文字と数える
- 995 :デフォルトの名無しさん (ワッチョイ 0fba-PET2):2017/02/20(月) 00:53:22.30 ID:fz3RD/iA0.net
- んなアホな
- 996 :デフォルトの名無しさん (スッップ Sd7f-yXFx):2017/02/20(月) 09:25:40.12 ID:jVgNOv8dd.net
- >>994
LinuxのAPIの話ならwchar_tは32bitだから、
これを使ってるんなら
サロゲートペアという概念は無いし、
Linuxでのwchar_tの1文字は基本的に4バイト
しかし、wchar_tが固定長文字と言う前提が、既に時代遅れになっちゃったなぁ
- 997 :デフォルトの名無しさん (ワッチョイ 3b3c-eq+O):2017/02/20(月) 10:01:05.56 ID:ChbPWtRt0.net
- 次スレ
http://echo.2ch.net/test/read.cgi/tech/1487552413/
- 998 :デフォルトの名無しさん (ワッチョイ bbbd-ea4t):2017/02/20(月) 12:28:23.27 ID:mI2RJMjC0.net
- お前ら文字列の扱い大好きだな
そんなに盛り上がる話なのかよwww
- 999 :デフォルトの名無しさん (ササクッテロラ Sp9f-BRgT):2017/02/20(月) 12:50:35.35 ID:fp9BsZKPp.net
- >>998
じゃあお前が何か盛り上がるネタを投下しろよ
- 1000 :1000ゲト (ワントンキン MM7f-WBM5):2017/02/20(月) 13:02:42.52 ID:sccSrbIhM.net
- 1000
総レス数 1000
303 KB
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver 2014.07.20.01.SC 2014/07/20 D ★