Swift

既存のiOSアプリをUIScene対応するやり方

(0)前提 既存アプリA…iOS12以前で UIApplicationDelegate のライフサイクルで動くやつ UIはStoryboardベース 参考アプリB…iOS13以降で UIWindowSceneDelegate のライフサイクルで動くやつ Xcode11でHello World的なやつを新規作成すればよい 必要なら Suppor…

Apple Pencilを使ってみる

ねんがんの iPad mini (第5世代) を手に入れたぞ。 ついでに Apple Pencil (第1世代) も買った。 えらい出費である。 よくあるiPad miniのこじゃれたレビューとかはしない。 Apple Pencilのプログラミング的な使い方はSDKサンプルの Leveraging Touch Input …

Core Text で縦書き(3)

前回 Core Text で縦書き(2) - 錯綜 のコメント欄で90度回転しなくていいやつを教えてもらえた。 こんな誰も読んでないようなブログでも親切な人が教えてくれたりするものである。 ありがたいことである。 というわけでやってみた。 まず普通に CTFrame を使…

Swiftでファミコンエミュレータを書いた(3)

githubに上げた。 github.com わかっている問題 音は出ない 遅い iOS実機で動作確認してない 対応している mapper は NROM だけ 遅い問題 Debug build だと 7 fpsくらいしか出ない。 (MacBook 2017, iOS Simulator) Release build だと 40 fps くらい出るの…

Swift製NESエミュレータその2

遅々として進まず。 nestest はまだたくさん失敗している。 「テスト失敗」の結果を得るまでが大変だった。 実装のミスではなく、仕様を読み違えている。 6502 の CMP のキャリーフラグの仕様変だよね。 思い込みはバグのもと。 color_test はちょっと動いて…

Swiftでファミコンのエミュレータを書いてみる

先週読んだこのブログエントリ Kotlinでファミコンのエミュレータを書いた - ゆいきノート に刺激を受けたので自分でも書いてみることにした。 Swift4.2, iOS12.0, Xcode10.0で。 なるべく他人の書いたソースコードは読まないようにして、 できるだけ文書や…

Core Graphics で半透明図形を描く

図形を塗りつぶす。 UIColor.red.setFill() UIBezierPath(rect: CGRect(x: 80, y: 80, width: 100, height: 100)).fill() 重ねて描く。 UIColor.blue.setFill() UIBezierPath(rect: CGRect(x: 100, y: 100, width: 100, height: 100)).fill() ここから半透明…

Core Text で縦書き(2)

NSAttributedString.draw(in:) なら Core Text 無しで縦書きできんじゃね? と思って試してみたけどそんな単純じゃなかった。 役物だけ回転しているので近づこうとしている気配はあるけど、 なにか指定方法があるのかどうなのか、ちょっとわからなかった。 さ…

Core Text で縦書き

Core Text でテキストを描画するには CTFrameDraw(_:_:) を呼べばいいのだけど、そのパラメータをどうつくるかという話。 FrameDraw 第2引数の CGContext は UIGraphicsGetCurrentContext() で得られる。 FrameDraw 第1引数の CTFrame は CTFramesetterCreat…

NSString の UIKit 拡張で文字列を描くやり方

iOS の UIView 派生クラスで func draw(_:) を override して UIBezierPath やら UIImage やらを描画する横並びで、 文字列も描画するやつの話。 import UIKit すると NSString.draw(at:withAttributes:) や NSString.draw(in:withAttributes:) が使える。 N…

diff(A*)

Rogue Likeか Tower Defense か何かで使おうとしてA*をつくっていたけど これってdiffだよね〜と思ってたらやっぱりdiffだったので diffにも使えるように改造していた。 ランダムに問題を生成してedit graph をA*でたどったもの A*のパラメータとしては S: …

Xcode update

Xcode のバージョンが 10.0 に上がった! Swift のバージョンが 4.2 に上がった! $ xcodebuild -version Xcode 10.0 Build version 10A255 $ swift --version Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1) Target: x86_64-apple-dar…

A*

ここのところA*をSwiftで実装していた。 アルゴリズムはwikipediaのとおり https://ja.wikipedia.org/wiki/A* 案の定なかなか動かないのだけど、いちど動いてしまえばああそうか、みたいな簡単なものである。 なかなかうまくいかないのは日本語の解釈の問題…

迷路

迷路生成アルゴリズムを実装した。 (壁伸ばし法) 1が壁で0が通路 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 0 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 Flood-fillアルゴリズムで通路(0)を2で塗りつぶす。 1 1…

Rogue Likeななにか

ダンジョンの自動生成を作っているけどなかなかぐっとくる感じにならない ------------------------- ------- |.......................| |.....| |.......................+#######|.....| |.......................| #+.....| |.......................| |…

Swift/Xcode 用の.gitignoreファイル

.gitignore ファイルはプロジェクトのトップディレクトリに作ればよい 中身は下記からコピペ github.com これでxcuserdata/などが要コミット一覧に出現するのを防げる

Swift LANGUAGE GUIDE を読んで書いたブログエントリの一覧

The Basics - 錯綜 Basic Operators - 錯綜 Strings and Characters - 錯綜 Collection Types - 錯綜 Control Flow - 錯綜 Functions - 錯綜 Closures - 錯綜 Enumerations - 錯綜 Classes and Structures - 錯綜 Properties - 錯綜 Methods - 錯綜 Subscrip…

Advanced Operators

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html を読む。 Swiftの算術演算子はオーバーフローしない Int16.max + 1 はエラー オーバーフローする演算子 オーバーフロー 加算 &+ オーバーフロー 減算 &- オーバーフ…

Access Control

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html を読む。 アクセスレベルは5段階 enum AccessLevel { case `open` case `public` case `internal` case `fileprivate` case `private` } レベルの高低は、openが最高(最…

Memory Safety

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html を読む。 シングルスレッドでも競合は起きる 次のすべての条件を満たす2つのアクセスがある場合、競合が発生する 少なくとも1つは書き込み メモリ内の同じ場所にアクセス…

Automatic Reference Counting

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html を読む。 ARCは「ちょうどうまくいく」 参照カウンタが適用されるのはクラスのインスタンスだけ 強い参照の循環ができるとメモリが開放されない 強い参照…

Generics

Genericsは鬼門だわ 昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Generics.html を読む。 genericな関数 func swapTwoValues<T>(_ a: inout T, _ b: inout T) {…} 使うときは swapTwoValues(&someValue, &anotherValue) 適切に型推論され</t>…

Protocols

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Protocols.html を読む。 protocol は 他の宣言の内側にネストできない extension と同じファイルスコープ、なのにエラーメッセージが違うのはなぜだ プロパティはインスタンスと型を要求で…

Extensions

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Extensions.html を読む。 オリジナルソースコードにアクセスできなくても機能性を追加できる(遡及モデリング) extension を宣言できるのはファイルスコープだけ extensionでプロトコル適合…

Type Casting

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/TypeCasting.html を読む。 Swiftの型キャストは isとas演算子 protocolをconformしているかどうかにも使える 型検査演算子 is item is Movie 「subclassかどうか」だけど構造体・列挙型で…

Error Handling

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html を読む。 Swiftでは、エラーは、Errorプロトコルに準拠した型の値として表される Swiftの列挙型はエラー状態に関連したグループをモデル化するのに特に適している Swift…

Optional Chaining

昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/OptionalChaining.html を読む。 強制アンラッピングの代替としてのオプショナル連鎖 オプショナル値の後に ? をつけて オプショナル値がnilのとき、オプショナル連鎖は優雅に失敗する、 強…

Deinitialization

今日のは少ない 昨日に引き続き https://docs.swift.org/swift-book/LanguageGuide/Deinitialization.html を読む。 Swiftのメモリ管理はARC deinitializer はクラスのインスタンスがメモリから解除される直前に呼び出される deinit キーワードをつかってini…

Initialization

訳はてきとう 前回に引き続き https://docs.swift.org/swift-book/LanguageGuide/Initialization.html を読む。 格納型プロパティは、初期化子のなかで値を設定するか、プロパティの宣言に初期値を書く 初期化子の中で値を設定するか、初期値を宣言したとき…

Inheritance

前回に引き続き https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html を読む。 何からも継承してないクラスはベースクラス Swiftのクラスはユニバーサル基底クラスからの継承ってのは無い クラスメソッド、インスタンスメソッド、クラスプロ…