開発ブログ - swiftカテゴリのエントリ

swift で protocol を dict のキーにしたい

カテゴリ : 
技術メモ » swift
執筆 : 
2017/8/25
swift3

swift で protocol を dict のキーにしたい

swift の Dictionary のキーは Hashable でなければならない
そこで protocol に Hashable をつけてみる


protocol Foo: Hashable {
  var a: Int { get }
}

var v: [Foo: Int] = [:]
v[f] = 1


しかしこれでは
Using 'Foo' as a concrete type conforming to protocol 'Hashable' is not supported
Protocol 'Foo' can only be used as a generic constraint because it has Self or associated type requirements

などとエラーになる
そこで ObjectIdentifier を使って

var v: [ObectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1

とするが
Cannot invoke initialize for type 'ObjectIdentifier' with an argument list of type '(Foo)'
となる
おそらく protocol は struct で実装することができ、
ObjectIdentifier は struct などには使えないからダメなのだろう
そこで Foo を class に限定する

protocol Foo: class {
  var a: Int { get }
}

var v: [ObjectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1


これで完成!
  • コメント (0)
  • トラックバック (0)

iOS アプリから外部ディスプレイへの出力

カテゴリ : 
技術メモ » swift
執筆 : 
2017/8/22
[UIScreen screens] count] で画面数を取得?
http://do-gugan.com/~furuta/archives/2012/01/ios_4.html

http://blog.syuhari.jp/archives/2251

swiftだと自動的にreleaseされてしまうので
UIWindow のインスタンスは保持しておかなければダメ!
  • コメント (0)
  • トラックバック (0)

swift coredata メソッド名に注意!

カテゴリ : 
技術メモ » swift
執筆 : 
2017/8/22
長いこと原因が分からなかったトラブルが
ようやくわかった!!!

swift で CoreData を使っていた
元々は ObjectiveC で書かれていたものを swift に書き直していたのだが
なぜか CoreData で relationship しているプロパティに代入をする部分で

NSInvalidArgumentException reason: [NSSet intersectsSet:]: set argument is not an NSSet

というエラーが発生していたのだった

原因は、自分で作成したメソッド名にあった
プロパティが members だとして
members にアクセスすると [Member]として取得できないので
func getMembers() -> [Member]
というメソッドを作成して、それを使っていたのだった
どうも、swift では getXxxxx というアクセッサが生成されているのか、
members にアクセスしたときに、getMembers() が呼ばれてしまい
そのために members が NSSet としてアクセスできなくなったためのようだ

という訳で、プロパティ名に get なんちゃら というようなメソッドを
無意識に使ってしまうのは、とても危険ということ
ちなみに、メソッド名を考えるのが面倒だったので
_getXxxxx としたら、これもダメだったみたい
全然ちがう名前を付けなければダメ
  • コメント (0)
  • トラックバック (0)

swift3 document ディレクトリが毎回変わる?

カテゴリ : 
技術メモ » swift
執筆 : 
2017/5/25
XCode 8 swift3

開発をしているときに
NSSearchPathForDirectoriesInDomains
で取得したドキュメントフォルダのパスが
なぜか毎回変わってしまっていました。
これじゃぁ困るよ!
と思っていたら、データを一つも書き込んでいなかったからのようでした...

全然気が付かなかったよ!
  • コメント (0)
  • トラックバック (0)
[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する
http://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/


RunScript にスクリプトを記述
PreferenceSpecifiers:N:...
の N の部分は適宜修正が必要


APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PRODUCT_SETTINGS_PATH")
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:2:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:3:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"


最初エラーが出て悩んだが PRODUCT_SETTINGS_PATH を "" していなかったせいだった
今回のプロジェクトはパスに空白を含んでいたので...
  • コメント (0)
  • トラックバック (0)
プロダクツ

開発ブログ

Link

AD