【Swift】SystemSoundID 一覧がないのですが

ちょっとしたときに、

あらかじめ用意されているシステム音を使いたい。


AudioServicesPlaySystemSound(1000)

👉 AudioServicesPlaySystemSound(_:) | Apple Developer Documentation hatena-bookmark

これだけで音が鳴る。

「1000」 は SystemSoundID というもののようなので、

「どんな音が鳴るのかリスト」を探すが、

公式で見つけられなかった。

以下にそれらしきもの。


👉 AudioServices - iPhone Development Wiki hatena-bookmark

結構、古そうなので今どきの状態を確認したい。

OSやバージョンなど環境によっても違うっぽい。

なので、コードからのぞいてみる。

 

🔊 欠番ID

ID は 2000 ぐらいまでの整数なのですが、

非公式のリストを見る限り、番号が歯抜け状態。

音声データの長さで「欠番らしき」を見分ける。

実際に再生してその時間を取得しました。


let start = Date()
AudioServicesPlaySystemSoundWithCompletion(1000) {
   let elapsed = Date().timeIntervalSince(start)
   print(elapsed)
}

// 1.566209077835083

👉 AudioServicesPlaySystemSoundWithCompletion(_:_:) | Apple Developer Documentation hatena-bookmark

おおまかに 再生時間 50ミリ秒 以下が欠番っぽい。

 

🔊 グリッドでボタン

ボタンを並べて Preview や Simulator や 実機 でどんな音があるのか確かめます 。



 

極力、deprecated な関数は避けていきたいです。

 

🔊 まとめ

実際に音声ファイルを作成する前に、雰囲気を確認したいときに使いたくなります。

しかし、ID が分からない。

そんな人用。

ファイルで探すなら、各環境内でディレクトリ名で走査するといいのですね !


Library/Audio/UISounds
❯ tree .
.
├── 3rd_party_critical.caf
├── AuthenticationMatch_Full.caf
├── AuthenticationMatch_Short.caf
...
├── ussd.caf
├── warsaw.caf
└── wheels_of_time.caf

4 directories, 321 files

あと、アプリとかショートカットもありました。

👉 「Play System Sounds」をApp Storeで hatena-bookmark
👉 System Sounds - Shortcuts hatena-bookmark


🚀 iOS version Market Share

iOS は Android OS に比べて、ユーザーの最新バージョンへの移行が早い。



また、来月早々には更新したいと思います。

👉 Android Version Market Share Worldwide hatena-bookmark


Constants - struct vs enum vs extension - #Swift

case-less enum と private init() な struct。


enum Constants {
  // no cases
  static let animationDuration: TimeInterval = 1.5
}

struct Constants {
  static let animationDuration: TimeInterval = 1.5
  private init() { }
}

👉 `static let` in enum vs struct? - Using Swift - Swift Forums hatena-bookmark

enum の多用が目に付く Swift。

extention で、


extension TimeInterval {
  static let animationDuration: TimeInterval = 1.5
}

とも書きたくなるけども。

方針をはっきり強制してもいいのでは、と思います。

新参組は悩みます。

👉 Swift constants: Struct or Enum - Stack Overflow hatena-bookmark
👉 Kotlin で Constants をどう書くべきか。 hatena-bookmark
👉 Android で 定数 (int)で enum を使うことは hatena-bookmark


「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」とは ?

位置がタイムラインに正確に表示できてない。

設定を見てみると、

👉 Google - マイ アクティビティ hatena-bookmark

iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください

なんやこれ ?

 

🗺️ Google マップ コミュニティ

Google マップ コミュニティで調べます。

タイムラインがいつのまにか記録されなくなり、調べたら「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」となっていて、使っているデバイスが選択出来なくなっていました。googleマップは今までと同じアカウントで同じアプリを使用してるのですが…どうすれば直るでしょうか?

👉 iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください - Google マップ コミュニティ hatena-bookmark

iPhone で。


設定

 ↓

プライバシーとセキュリティ

 ↓

位置情報サービス

 ↓

Google Maps

これでも、直らん。

 

🗺️ まとめ

精度 (細かさ) が落ちたんでしょうね。

また、AndroidとiOSでは、この元データのスポットの採取タイミングに違いがあり、Androidに比べてiOSのほうが取得頻度が低いため、類推するための情報が少なくなってしまい、余計に直線になってしまうことがあるような気がしています。

取得頻度は、過去は結構な頻度で取得されていたのですが、いま時点は非常に少ないと思います。

👉 タイムライン表示で、元データはスポットとして残っているのに大部分が経路として参照されず、数点を直線で結んでしまうのはなぜでしょう。 - Google マップ コミュニティ hatena-bookmark

ここでも、また、悲しい感じとなってますね。

「iOS デバイスで位置情報対応の Google アプリを使用して設定を変更してください」 は消すことができませんし。


【Swift】split(separator: ) vs components(separatedBy:)

2つあるけど、どっちを使うか。

どっちから使っていくか。


"1 2 3".split(separator: " ")
// ["1", "2", "3"]

"1 2 3".components(separatedBy: " ")
// ["1", "2", "3"]

split のほうが短いし、分かりやすくね?

 

■ 最初と最後の区切り文字


" 1 2 3 ".split(separator: " ")
// ["1", "2", "3"]

" 1 2 3 ".components(separatedBy: " ")
// ["", "1", "2", "3", ""]

 

■ 連続する区切り文字


"1  2  3".split(separator: " ")
// ["1", "2", "3"]

"1  2  3".components(separatedBy: " ")
// ["1", "", "2", "", "3"]

 

■ 割れない場合


"123".split(separator: " ")
// ["123"]

"123".components(separatedBy: " ")
// ["123"]

"1 2 3".split(separator: "23")
// ["1 2 3"]

"1 2 3".components(separatedBy: "23")
// ["1 2 3"]

"1 2 3".split(separator: "  ")
// ["1 2 3"]

"1 2 3".components(separatedBy: "  ")
// ["1 2 3"]

 

■ 空文字で割る


"123".split(separator: "")
// ["1", "2", "3"]

"123".components(separatedBy: "") 
// ["123"]

"1 2 3".split(separator: "")
// ["1", " ", "2", " ", "3"]

"1 2 3".components(separatedBy: "") 
// ["1 2 3"]

" 1 2 3 ".split(separator: "")
// [" ", "1", " ", "2", " ", "3", " "]

" 1 2 3 ".components(separatedBy: "") 
// [" 1 2 3 "]

"  1  2  3  ".split(separator: "")
// [" ", " ", "1", " ", " ", "2", " ", " ", "3", " ", " "]

"  1  2  3  ".components(separatedBy: "")
// ["  1  2  3  "]

 

■ 空文字を分割


"".split(separator: " ")
// []

"".components(separatedBy: " ")
// [""]

"".split(separator: "23") 
// []

"".components(separatedBy: "23")
// [""]

"".split(separator: "  ")
// []

"".components(separatedBy: "  ")
// [""]

"".split(separator: "")
// []

"".components(separatedBy: "")
// [""]

 

■ それでも直感的に分かりづらいような


"123".split(separator: "123")
// []

"123".components(separatedBy: "123")
// ["", ""]

"123".split(separator: "23")
// ["1"]

"123".components(separatedBy: "23")
// ["1", ""]

"  1  2  3  ".split(separator: " ")
// ["1", "2", "3"]

"  1  2  3  ".components(separatedBy: " ")
// ["", "", "1", "", "2", "", "3", "", ""]

 

■ まとめ

それぞれ他にも引数はいろいろあるようですが、


components(separatedBy:)

のほうがはっきり明快で分かりやすいように思えますが。


"  1  2  3  "
  .split(separator: " ")   // ["1", "2", "3"]
  .joined(separator: " ")  // "1 2 3"

"  1  2  3  "
  .components(separatedBy: " ") // ["", "", "1", "", "2", "", "3", "", ""]
  .joined(separator: " ")       // "  1  2  3  "

将来的にどうなるのか。

👉 【Swift】なんとなくメソッド名が長い気がする hatena-bookmark
👉 swift - component(separatedBy:) versus .split(separator: ) - Stack Overflow hatena-bookmark