could not build objective-c module 'Foo' とは

SwiftからObjective-Cのライブラリを呼び出してたらビルドは成功するのだが、エラー表示が消えなかった。

could not build objective-c module 'Foo'

これはXcodeのキャッシュデータがおかしくなってるときに起きるみたい。

なので、そのキャッシュデータを消してやると良い。

手順

  1. Xcodeを閉じる
  2. rm -rf ~/Library/Developer/Xcode/DerivedData
  3. 再度Xcodeを開いてビルドする

参考リンク

Swift. Could not build objective-c module 'Alamofire' - Stack Overflow

yukicoder - No.430 文字列検索

No.430 文字列検索 - yukicoder

事前に1文字〜10文字分のすべての部分文字列をカウントしてmapに入れておいた。 なんか解説みて気づいたけど想定解とは違うのか。

signed main() {
    string S;
    int M;
    map<string, int> mp;
    cin>>S>>M;
    for (int i=0;i<S.size();i++){
        for(int j=1;j<=10;j++){
            if(S.size()-i>=j)
                mp[S.substr(i, j)]++;
        }
    }
    ll res = 0;
    for(int i=0;i<M;i++){
        string C;
        cin>>C;
        res += mp[C];
    }
    cout<<res<<endl;

    return 0;
}

yukicoder - No.33 アメーバがたくさん

No.33 アメーバがたくさん - yukicoder

アメーバの分裂。 分裂が衝突しちゃうものを考慮しないといけない。 こういう問題、コンテストとかで出されたらミスしまくりそう。

signed main() {
    ll N,D,T;
    cin>>N>>D>>T;
    vector<ll> X(N);

    for(int i=0;i<N;i++)
        cin>>X[i];
    sort(X.begin(), X.end());

    // 負の値があれば全て0以上に底上げしておく
    if (X[0] < 0) {
        ll x0 = -X[0];
        for(int i=0;i<N;i++)
            X[i] += x0;
    }

    ll ret = 0;
    ret += N;
    for(int i=0;i<N;i++){
        // 左をチェック
        bool found = false;
        for(int j=i-1;j>=0;j--) {
            ll diff = X[i] - X[j];
            if (diff % D == 0) {
                // 左方向への分裂は、右方向へ分裂してくるものとの衝突を考慮する
                ll mx_count = diff / D - 1;
                if (mx_count > T){
                    ret += min(T, mx_count - T);
                }
                found = true;
                break;
            }
        }
        if (!found) ret += T;
        found = false;
        // 右をチェック
        for(int j=i + 1;j < N;j++) {
            ll diff = X[j] - X[i];
            if (diff % D == 0) {
                // 右方向への分裂は、初期位置にいるものとの衝突のみ考慮する
                ll mx_count = diff / D - 1;
                ret += min(T, mx_count);
                found = true;
                break;
            }
        }
        if (!found) ret += T;
    }
    cout<<ret<<endl;
    return 0;
}

yukicoder - No.32 貯金箱の憂鬱

No.32 貯金箱の憂鬱 - yukicoder

貪欲法ですね。高い紙幣・硬貨から順に使っていく。

signed main() {
    int L,M,N;
    cin>>L>>M>>N;
    int res = 0;

    # 1000円以上は全部無視
    int amount = (L * 100 + M * 25 + N) % 1000;
    amount %= 1000;
    # 100円
    res += amount / 100;
    amount %= 100;
    # 25円
    res += amount / 25;
    amount %= 25;
    # 残りの1円
    res += amount;
    cout << res << endl;
    return 0;
}

yukicoder - No.11 カードマッチ

No.11 カードマッチ - yukicoder

この手のものは、一旦何も考えず全部足していって、最後に余計なものをひいていくのがうまくいくかな?

set <ll> sets, setk;

signed main() {
    ll W,H,N;
    cin>>W>>H>>N;

    for(int i=0;i<N;i++){
        ll S,K;
        cin>>S>>K;
        sets.insert(S);
        setk.insert(K);
    }

    ll res = 0;
    // 1. 同じマークのもの
    res += H * sets.size();
    // 2. 同じ数字のもの
    res += W * setk.size();
    // 1と2で重複して数えたものをひく
    res -= setk.size() * sets.size();
    // 手札はカウントしないのでひく
    res -= N;

    cout<<res<<endl;

    return 0;
}

Could not cast value of type UIView to SKView

Could not cast value of type 'UIView' (0x107bcbdf8) to 'SKView' (0x10649bad0). (lldb)

SpriteKitではじめる2Dゲームプログラミング Swift対応の第三章を進めていたらいきなりエラーが発生した。 これは実際にオブジェクトがSKViewでないため、ダウンキャストに失敗して実行時エラーになってるみたい。

サポートページにアクセスすると、以下のように指定したらOKとのこと。

SpriteKitではじめる2Dゲームプログラミング Swift対応(山下佳隆 村田知常 原知愛 近藤秀彦) | 翔泳社の本

89ページ Custom Classの変更について
89ページ「クラスの変更」の「MEMO」の下の文章2~3行目に「Custom Class のClass の部分に灰色でUIView と書かれていますが、ここを「SKView」に変更します。」と記載がありますが、Custom Classの変更時には、(「SKView」がClass欄の選択肢には表示されないため)Class欄に「SKView」と手入力してください。
ただし、以下の設定を行なうことで、Class欄の選択肢に「SKView」を表示することもできます。

★Custom Classの選択肢に「SKView」を表示する方法
以下の手順でプロジェクトにフレームワークを追加することで選択肢に表示することができます。

1. プロジェクトナビゲータ最上部のプロジェクト名(HelpNagoyaSpecialty)が書かれた部分をクリックし、プロジェクトの設定を
  表示します
2. エディタ最上部のタブは「General」を選択します
3. 「Linked Frameworks and Libraries」の「+」ボタンをクリックします
4. 一覧の中より「SpriteKit.framework」を選択し「Add」ボタンをクリックします

これでStoryboardに戻り、Custom Classを変更する際には「SKView」が選択肢に含まれるようになります。

SpriteKitではじめる2Dゲームプログラミング Swift対応

SpriteKitではじめる2Dゲームプログラミング Swift対応

Setting up CocoaPods master repoから進まないとき

-> % pod install
Setting up CocoaPods master repo

から何も進まないときは、単にgitレポジトリが巨大すぎてかなり時間がかかっている模様。

なので、ずーっと待つといつか終わるはずです。

気になる場合は、ctrl-cなどでキャンセルしてverboseオプションつけて再度実行してみるとやっぱりgitのcloneで時間かかってるなぁというのがわかります。

-> % pod install --verbose
  Preparing

Setting up CocoaPods master repo

Cloning spec repo `master` from `https://github.com/CocoaPods/Specs.git` (branch `master`)
  $ /usr/local/bin/git clone https://github.com/CocoaPods/Specs.git master
  Cloning into 'master'...

参考リンク

stackoverflow.com