Swift インスタンスのテキスト表現 CustomStringConvertible

CustomStringConvertible

Swiftでクラスなどのインスタンスをprint()した場合、その中身がなにであるのかを確認できません。(lldbでpoすればいいのだけなんですが。。。)そのような場合CustomStringConvertibleというprotocolを使えばカスタマイズした文字をprint()などに表示できます。

class Novel : CustomStringConvertible{
    var author: String!
    var kana: String!
    init(_author: String, _kana: String) {
        self.author = _author
        self.kana = _kana
    }
    var description: String {
        return "\(self.author!)\(self.kana!))"
    }
}

上記のような感じでCustomStringConvertibleprotocolなので継承して使います。protocolの中にdescriptionを持っていますのでそれを利用します。

let novel1 = Novel(_author: "George Orwell", _kana: "ジョージ・オーウェル")
print(novel1)

上記コードを実行するとdescriptionが呼ばれ「“George Orwell(ジョージ・オーウェル)\n”」が出力されました。下記コードのようにCustomStringConvertiblestructでも利用できます。

struct Novel : CustomStringConvertible {
    var author: String!
    var description: String {
        return self.author
    }
}

let Novel2 = Novel(author: "James Patrick Hogan")
print(Novel2)

Swift NSSavePanelで Thread 1: EXC_BREAKPOINT

NSSavePanel runModal()

Swift macOS App デフォルトプロジェクトで、NSSavePanel()を使った場合Thread 1: EXC_BREAKPOINT が出て下記のようなエラーが表示されます。

[OpenSavePanels] ERROR: Unable to display save panel: your app has the User Selected File Read entitlement but it needs User Selected File Read/Write to display save panels. Please ensure that your app's target capabilities include the proper entitlements.

Sandboxの設定が「User Selected File = ReadOnly」になっているので「Read / Write」に変更すれば解決します。

User selected file read write
User Selected File = Read / Write

一度でもビルドに成功していてUser Selected File = ReadOnlyに変更した場合下記のメッセージが出ます

error: Entitlements file "xxx.entitlements" was modified during the build, which is not supported. You can disable this error by setting 'CODE_SIGN_ALLOW_ENTITLEMENTS_MODIFICATION' to 'YES', however this may cause the built product's code signature or provisioning profile to contain incorrect entitlements. (in target 'xxx' from project 'xxx')

2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED