開発ブログ - swiftカテゴリのエントリ
swift3
swift で protocol を dict のキーにしたい
swift の Dictionary のキーは Hashable でなければならない
そこで protocol に Hashable をつけてみる
しかしこれでは
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 を使って
とするが
Cannot invoke initialize for type 'ObjectIdentifier' with an argument list of type '(Foo)'
となる
おそらく protocol は struct で実装することができ、
ObjectIdentifier は struct などには使えないからダメなのだろう
そこで Foo を class に限定する
これで完成!
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
これで完成!
[UIScreen screens] count] で画面数を取得?
http://do-gugan.com/~furuta/archives/2012/01/ios_4.html
http://blog.syuhari.jp/archives/2251
swiftだと自動的にreleaseされてしまうので
UIWindow のインスタンスは保持しておかなければダメ!
http://do-gugan.com/~furuta/archives/2012/01/ios_4.html
http://blog.syuhari.jp/archives/2251
swiftだと自動的にreleaseされてしまうので
UIWindow のインスタンスは保持しておかなければダメ!
長いこと原因が分からなかったトラブルが
ようやくわかった!!!
swift で CoreData を使っていた
元々は ObjectiveC で書かれていたものを swift に書き直していたのだが
なぜか CoreData で relationship しているプロパティに代入をする部分で
というエラーが発生していたのだった
原因は、自分で作成したメソッド名にあった
プロパティが members だとして
members にアクセスすると [Member]として取得できないので
func getMembers() -> [Member]
というメソッドを作成して、それを使っていたのだった
どうも、swift では getXxxxx というアクセッサが生成されているのか、
members にアクセスしたときに、getMembers() が呼ばれてしまい
そのために members が NSSet としてアクセスできなくなったためのようだ
という訳で、プロパティ名に get なんちゃら というようなメソッドを
無意識に使ってしまうのは、とても危険ということ
ちなみに、メソッド名を考えるのが面倒だったので
_getXxxxx としたら、これもダメだったみたい
全然ちがう名前を付けなければダメ
ようやくわかった!!!
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 としたら、これもダメだったみたい
全然ちがう名前を付けなければダメ
XCode 8 swift3
開発をしているときに
NSSearchPathForDirectoriesInDomains
で取得したドキュメントフォルダのパスが
なぜか毎回変わってしまっていました。
これじゃぁ困るよ!
と思っていたら、データを一つも書き込んでいなかったからのようでした...
全然気が付かなかったよ!
開発をしているときに
NSSearchPathForDirectoriesInDomains
で取得したドキュメントフォルダのパスが
なぜか毎回変わってしまっていました。
これじゃぁ困るよ!
と思っていたら、データを一つも書き込んでいなかったからのようでした...
全然気が付かなかったよ!
[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する
http://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/
RunScript にスクリプトを記述
PreferenceSpecifiers:N:...
の N の部分は適宜修正が必要
最初エラーが出て悩んだが PRODUCT_SETTINGS_PATH を "" していなかったせいだった
今回のプロジェクトはパスに空白を含んでいたので...
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 を "" していなかったせいだった
今回のプロジェクトはパスに空白を含んでいたので...