NSString の UIKit 拡張で文字列を描くやり方
iOS の UIView
派生クラスで
func draw(_:)
を override
して
UIBezierPath
やら UIImage
やらを描画する横並びで、
文字列も描画するやつの話。
import UIKit
すると
NSString.draw(at:withAttributes:)
や
NSString.draw(in:withAttributes:)
が使える。
NSString
は String
から as
で型変換できる
let string = "Hello" let nsstring = string as NSString
(10, 10)の位置に文字列を描く(アトリビュートなし)。
let p = CGPoint(x: 10, y: 10) nsstring.draw(at: p)
ついでに枠線も描いてみる。
NSString.size(withAttributes:)
で文字列を描くために必要な領域の高さと幅が得られる。
let size = nsstring.size() UIColor.red.setStroke() UIBezierPath(rect: CGRect(origin: p, size: size)).stroke()
ところでなぜだか NSString
ではなく String
のインスタンスでも NSString.draw(at:withAttributes:)
が呼び出せる様子。
let string = "Hello" let p = CGPoint(x: 10, y: 10) string.draw(at: p) // ←これ let size = string.size() // ←これも UIColor.red.setStroke() UIBezierPath(rect: CGRect(origin: p, size: size)).stroke()
これは、暗黙の型変換がされているのか、何か特別な対応がされているのか、 小一時間調べたくらいじゃわからなかった。 (教えて偉い人)
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-darwin17.7.0
A*
ここのところA*をSwiftで実装していた。
案の定なかなか動かないのだけど、いちど動いてしまえばああそうか、みたいな簡単なものである。 なかなかうまくいかないのは日本語の解釈の問題なので、 それはつまり読み取り側の能力が足りないからだけど、 アルゴリズムは自然言語じゃなく架空でいいのでプログラミング言語っぽい言語で書いて欲しいものである。
ノード配列から最小値を持つノードを見つける、なんてのはSwiftっぽい書き方ができてちょっとうれしい。
while let n = openList.min(by: { (a, b) -> Bool in a.value < b.value }) {〜}
ただ「取り出す」などと書いてあるとそれはリストからremoveすることも意味していたりするので 削除するとなるとindexが必要で…などとなってちょっとAh...という気持ちになる
別件で UIGraphicsImageRenderer
も調べていたので問題と解を画像化してみたりしてみた。
迷路
迷路生成アルゴリズムを実装した。 (壁伸ばし法)
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 1 1 1 1 1 1 1 1 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 2 1 1 2 2 2 1 2 2 2 1 1 1 1 2 1 2 1 2 1 1 2 2 2 2 2 1 2 1 1 1 1 1 1 1 1 1 1
通路(0)がなくなっていれば、通路は連結している(壁に塞がれた通路は無い)と診断できる。
同様に壁(1)を3で塗りつぶす。
3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 3 2 3 3 3 3 2 3 3 3 2 3 3 2 2 2 3 2 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 2 2 2 3 2 3 3 3 3 3 3 3 3 3 3
壁(1)がなくなっていれば、壁は連結している(通路に回廊は無い)と診断できる
Rogue Likeななにか
ダンジョンの自動生成を作っているけどなかなかぐっとくる感じにならない
------------------------- ------- |.......................| |.....| |.......................+#######|.....| |.......................| #+.....| |.......................| |.....| |.......................| |.....| ---+-+------------------- --+---- # # # ####### ############################## # ## ---+----- --------++----- |.......| #####+.............| |.......| # |.............| |.......| # |.............| |.......| # |.............| |.......| # |.............| |.......| # ------------+-- |.......| # # |.......| # # |.......| # ######### |.......| # # ------------- |.......| # # |...........| |.......| # # ###+...........| |.......| # # # |...........| |.......+#### # # |...........| |.......| # # |...........| --------- -------+----- # -+----------- |...........+#### # |...........| # |...........| ## |...........| ----+---- |...........| |.......| ------------- |.......| |.......| |.......| |.......| ---------