<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE feed [
      <!ENTITY lt "&#38;#60;">
      <!ENTITY gt "&#62;">
      <!ENTITY amp "&#38;#38;">
      <!ENTITY apos "&#39;">
      <!ENTITY quot "&#34;">
      <!ENTITY nbsp "&#160;">
      <!ENTITY copy "&#169;">
]>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title type="text">開発ブログ</title>
    <subtitle type="text">MASA Lab softlab-Software Architecture Laboratory</subtitle>
    <updated>2026-04-16T12:43:16+09:00</updated>
    <id>http://softlab.masa-lab.net/modules/d3blog/index.php</id>
    <link rel="alternate" type="text/xhtml" hreflang="ja" href="http://softlab.masa-lab.net/" />
    <link rel="self" type="application/atom+xml" href="http://softlab.masa-lab.net/modules/d3blog/index.php?page=atom" />
    <rights>Copyright &copy; 2008-2019 by MASA-Lab</rights>
    <generator uri="http://softlab.masa-lab.net/">D3BLOG - XOOPS BLOG MODULE</generator>
    <entry>
        <title>swift で protocol を dict のキーにしたい</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=270" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=270</id>
        <published>2017-08-25T22:10:00+09:00</published>
        <updated>2018-02-16T15:28:43+09:00</updated>
        <category term="swift" label="swift" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">swift3swift で protocol を dict のキーにしたいswift の Dictionary のキーは Hashable でなければならないそこで protocol に Hashable をつけてみる
protocol Foo: Hashable {
  var a: Int { get }
}

var v: [Foo: Int] = [:...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>swift3<br /><br />swift で protocol を dict のキーにしたい<br /><br />swift の Dictionary のキーは Hashable でなければならない<br />そこで protocol に Hashable をつけてみる<br /><br /><pre class="blogCode"><code>
protocol Foo: Hashable {
  var a: Int { get }
}

var v: [Foo: Int] = [:]
v[f] = 1

</code></pre><br />しかしこれでは<br />Using 'Foo' as a concrete type conforming to protocol 'Hashable' is not supported<br />Protocol 'Foo' can only be used as a generic constraint because it has Self or associated type requirements<br /><br />などとエラーになる<br />そこで ObjectIdentifier を使って<br /><pre class="blogCode"><code>
var v: [ObectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1
</code></pre><br />とするが<br />Cannot invoke initialize for type 'ObjectIdentifier' with an argument list of type '(Foo)'<br />となる<br />おそらく protocol は struct で実装することができ、<br />ObjectIdentifier は struct などには使えないからダメなのだろう<br />そこで Foo を class に限定する<br /><pre class="blogCode"><code>
protocol Foo: class {
  var a: Int { get }
}

var v: [ObjectIdentifier: Int] = [:]
v[ObjectIdentifier(f)] = 1
</code></pre><br /><br />これで完成！</div>]]>
       </content>
    </entry>
    <entry>
        <title>iOS アプリから外部ディスプレイへの出力</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=223" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=223</id>
        <published>2017-08-22T21:10:00+09:00</published>
        <updated>2018-02-16T15:27:32+09:00</updated>
        <category term="swift" label="swift" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">[UIScreen screens] count] で画面数を取得？http://do-gugan.com/~furuta/archives/2012/01/ios_4.htmlhttp://blog.syuhari.jp/archives/2251swiftだと自動的にreleaseされてしまうのでUIWindow のインスタンスは保持しておかなけ...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>[UIScreen screens] count] で画面数を取得？<br /><a href="http://do-gugan.com/~furuta/archives/2012/01/ios_4.html" rel="external">http://do-gugan.com/~furuta/archives/2012/01/ios_4.html</a><br /><br /><a href="http://blog.syuhari.jp/archives/2251" rel="external">http://blog.syuhari.jp/archives/2251</a><br /><br />swiftだと自動的にreleaseされてしまうので<br />UIWindow のインスタンスは保持しておかなければダメ！</div>]]>
       </content>
    </entry>
    <entry>
        <title>swift coredata メソッド名に注意！</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=268" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=268</id>
        <published>2017-08-22T20:23:43+09:00</published>
        <updated>2018-02-16T15:27:16+09:00</updated>
        <category term="swift" label="swift" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">長いこと原因が分からなかったトラブルがようやくわかった！！！swift で CoreData を使っていた元々は ObjectiveC で書かれていたものを swift に書き直していたのだがなぜか CoreData で relationshi...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>長いこと原因が分からなかったトラブルが<br />ようやくわかった！！！<br /><br />swift で CoreData を使っていた<br />元々は ObjectiveC で書かれていたものを swift に書き直していたのだが<br />なぜか CoreData で relationship しているプロパティに代入をする部分で<br /><pre class="blogCode"><code>
NSInvalidArgumentException reason: [NSSet intersectsSet:]: set argument is not an NSSet
</code></pre><br />というエラーが発生していたのだった<br /><br />原因は、自分で作成したメソッド名にあった<br />プロパティが members だとして<br />members にアクセスすると [Member]として取得できないので<br />func getMembers() -> [Member]<br />というメソッドを作成して、それを使っていたのだった<br />どうも、swift では getXxxxx というアクセッサが生成されているのか、<br />members にアクセスしたときに、getMembers() が呼ばれてしまい<br />そのために members が NSSet としてアクセスできなくなったためのようだ<br /><br />という訳で、プロパティ名に get なんちゃら というようなメソッドを<br />無意識に使ってしまうのは、とても危険ということ<br />ちなみに、メソッド名を考えるのが面倒だったので<br />_getXxxxx としたら、これもダメだったみたい<br />全然ちがう名前を付けなければダメ</div>]]>
       </content>
    </entry>
    <entry>
        <title>swift3 document ディレクトリが毎回変わる？</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=263" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=263</id>
        <published>2017-05-25T22:30:00+09:00</published>
        <updated>2018-02-16T15:24:52+09:00</updated>
        <category term="swift" label="swift" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">XCode 8 swift3開発をしているときにNSSearchPathForDirectoriesInDomainsで取得したドキュメントフォルダのパスがなぜか毎回変わってしまっていました。これじゃぁ困るよ！と思っていたら、データ...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>XCode 8 swift3<br /><br />開発をしているときに<br />NSSearchPathForDirectoriesInDomains<br />で取得したドキュメントフォルダのパスが<br />なぜか毎回変わってしまっていました。<br />これじゃぁ困るよ！<br />と思っていたら、データを一つも書き込んでいなかったからのようでした...<br /><br />全然気が付かなかったよ！</div>]]>
       </content>
    </entry>
    <entry>
        <title>Xcode バージョン番号を設定画面に埋め込む</title>
        <link rel="alternate" type="text/xhtml" href="http://softlab.masa-lab.net/modules/d3blog/details.php?bid=255" />
        <id>http://softlab.masa-lab.net/modules/d3blog/details.php?bid=255</id>
        <published>2017-03-03T22:20:00+09:00</published>
        <updated>2018-02-16T15:18:02+09:00</updated>
        <category term="swift" label="swift" />
        <author>
            <name>masa</name>
        </author>
        <summary type="html" xml:base="http://softlab.masa-lab.net/" xml:lang="ja">[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定するhttp://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/RunScript にスクリプトを記述PreferenceSpecifiers:N:...の N の部分は適宜...</summary>
       <content type="html" xml:lang="ja" xml:base="http://softlab.masa-lab.net/">
<![CDATA[<div>[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する<br /><a href="http://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/" rel="external">http://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/</a><br /><br /><br />RunScript にスクリプトを記述<br />PreferenceSpecifiers:N:...<br />の N の部分は適宜修正が必要<br /><br /><pre class="blogCode"><code>
APP_VERSION=$(/usr/libexec/PlistBuddy -c &quot;Print CFBundleShortVersionString&quot; &quot;$PRODUCT_SETTINGS_PATH&quot;)
/usr/libexec/PlistBuddy -c &quot;Set :PreferenceSpecifiers:2:DefaultValue ${APP_VERSION}&quot; &quot;${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist&quot;

BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c &quot;Print CFBundleVersion&quot; &quot;$PRODUCT_SETTINGS_PATH&quot;)
/usr/libexec/PlistBuddy -c &quot;Set :PreferenceSpecifiers:3:DefaultValue ${BUILD_NUMBER}&quot; &quot;${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist&quot;
</code></pre><br /><br />最初エラーが出て悩んだが PRODUCT_SETTINGS_PATH を "" していなかったせいだった<br />今回のプロジェクトはパスに空白を含んでいたので...</div>]]>
       </content>
    </entry>
</feed>