Objective-CからSwiftへの変換メモ その5

Xcodeに任せてできたコードが落ちたのでメモして置く。

Objective-Cだと、辞書からメッセージを取り出せる。

- (void)displayAlert:(NSDictionary*)aDictionary {

    NSAlert *alert = [[NSAlert alloc] init];
    [alert addButtonWithTitle:@"OK"];
    [alert setMessageText:[aDictionary objectForKey:@"messageText"]];
    [alert setInformativeText:[aDictionary objectForKey:@"InformativeText"]];
    [alert beginSheetModalForWindow:[[NSApplication sharedApplication] mainWindow] completionHandler:^(NSModalResponse returnCode) {

    }];
}

上記コードをobjc2swiftで変換し、さらにXcodeの修正要求を反映したものが以下。

func displayAlert(aDictionary: Dictionary) {
    let alert = NSAlert()
    alert.addButton(withTitle: "OK")
    alert.messageText = aDictionary["messageText"]!
    alert.informativeText = aDictionary["informativeText"]!
    alert.beginSheetModal(for: self.view.window!, completionHandler: { (returnCode: NSApplication.ModalResponse) in

    }
)}

動作させ見たら、lldbが起動してアプリが落ちた。
エラーの内容は「Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value」
そう言われても分からないので、ネットを漁って分かった動作するコードが以下。辞書は使ってない。

func displayAlert(question: String, text: String) {

        let alert = NSAlert()
        alert.addButton(withTitle: "OK")
        alert.messageText = question
        alert.informativeText = text
        alert.beginSheetModal(for: self.view.window!, completionHandler: { (returnCode: NSApplication.ModalResponse) in })
        return
}

動作するコードを見つけたので逃げてしまったが、どうやらDictionary経由で値を渡すとnilが入り、nilをアンラップしようとして落ちることまでは突き止めた。何故String型引数を二つ持つと良くてDictionaryだとあかんのか良く分からん。誰か教えて!

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL