デバイスをオブジェクト化してみる

投稿者: | 2017年2月11日

形から入ってそれっぽくクラスを作ったりしていたんですが、なんとなくしっくりこない。

○×(まるぺけ)つくろーどっとコムを参考に、もういちどよく考えてみました。クラス名に動詞が入っているのは変だよね?てか作り方がオブジェクト指向じゃないんだ。

イメージ的にはメインルーチンのソースコードはこんな感じになるのかな?

import Foundation
import Cocoa
let screen = Screen()
let pasteboard = Pasteboard()
let arguments: [String] = CommandLine.arguments
let message = Message()
let condition = Condition()
condition.set(arguments)
if message.status == 0 {
  pasteboard.write(message.string)
}
screen.write(message.string)
exit(message.status)

とりあえず画面オブジェクトとクリップボードクラスを作ります。本当はクラスの継承とかやってみたいんですが、共通するメソッドがないのでそれぞれ独立したクラスです。

class Screen {
  func write(message:String) {
    print(message)
  }
}
import Cocoa    // Pasteboard device is required.
class Pasteboard {
  private let board: NSPasteboard
  private let item: NSPasteboardItem
  private var content: String!
  init(board: NSPasteboard = NSPasteboard.general(), item: NSPasteboardItem = NSPasteboardItem(),
        content: String! = nil) {
    self.board = board
    self.item = item
    self.content = content
  }
  func write(message:String) {
    board.clearContents()
    item.setString(message, forType: NSPasteboardTypeString)
    board.writeObjects([item])
  }
  func read() -> String {
    content = board.string(forType: NSPasteboardTypeString)
    if content == nil {
      content = ""
    }
    return content
  }
}

クリップボードクラスの変数定義で”!”を使っています。これは以前オプショナル型のところであえて触れなかったところ。

“?”の方のオプショナル型を使うときは中身がnilでなくても必ずアンラップする必要がありました。逆に”!”のオプショナル型は、nilを受け付けるけれど使用時に強制的にアンラップされてしまうものです。

今回のように使用する前にnilチェックをして必ず値が入っているようにしないと実行時にクラッシュします。

というわけでテストコードはこちら。

#! /usr/bin/swift
import Foundation
let screen = Screen()
let pasteboard = Pasteboard()
let message = "Test message"
print("If string below is '\(message)', it is OK.")
screen.write(message:message)
print("Original pasteboard contains '\(pasteboard.read())'.")
pasteboard.write(message:message)
print("And if pasteboard contains '\(pasteboard.read())'.")

結果は目視チェックでお願いします。。。

アマゾンでオブジェクト指向の本を買って勉強中ですよ。

コメントを残す

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