クリップボードを使ってみる

投稿者: | 2017年2月6日

PowerShellスクリプト版は生成したパスワードをクリップボードにコピーしています。シェルスクリプトはunix汎用なのでこの機能はありませんが、macOSで動くSwift版もクリップボードが使えると便利ですね。ついでなのでこれも付けちゃいましょう。

NSPasteboardクラスを使う

Swiftのクリップボードで検索をかけるとUIPasteboardについての記事がたくさんヒットするんですが、これはiOS用みたい。

macOS用はNSPasteboardを使います。そしてこれを使うにはimport Cocoaしないといけません。拾ってきたコードを載せます。

let board = NSPasteboard.general()
board.clearContents()
let item = NSPasteboardItem()
item.setString(some_text, forType: NSPasteboardTypeString)
board.writeObjects([item])

まずNSPasteboard.general()でインスタンスを生成したら.clearContents()で中身をクリアします。次にNSPasteboardItem()でインスタンスを生成して.setString()でクリップボードの中身を指定して、これをクリップボードのインスタンスに対して.writeObjects()で書き込んでいます。

4行目のsome_textのところが実際にクリップボードに書き込むテキストの内容になります。

mkpassプロトタイプ改

前回のプロトタイプにクリップボードコピーコードを追加したのがこちら。

#! /usr/bin/swift
import Foundation
import Cocoa
let arguments: [String] = CommandLine.arguments
var returnSet: (upper:Bool, lower:Bool, number:Bool, symbol:Bool, exclude:Bool, length:Int, status:Int)
var member: [String] = []
returnSet = CheckOption(arguments: arguments).getOption()
if !(returnSet.upper || returnSet.lower || returnSet.number || returnSet.symbol) {
     returnSet.lower = true
     returnSet.number = true
}
if returnSet.length == 0 {
  returnSet.length = 8
}
if returnSet.upper {
  if returnSet.exclude {
    member += GenerateMember().getMember(range: [[65,90]], exclude: [14,8])
  } else {
    member += GenerateMember().getMember(range: [[65,90]], exclude: [])
  }
}
if returnSet.lower {
  if returnSet.exclude {
    member += GenerateMember().getMember(range: [[97,122]], exclude: [11])
  } else {
    member += GenerateMember().getMember(range: [[97,122]], exclude: [])
  }
}
if returnSet.number {
  if returnSet.exclude {
    member += GenerateMember().getMember(range: [[48,57]], exclude: [1,0])
  } else {
    member += GenerateMember().getMember(range: [[48,57]], exclude: [])
  }
}
if returnSet.symbol {
  if returnSet.exclude {
    member += GenerateMember().getMember(range: [[33,47],[58,64],[91,96],[123,126]], exclude: [29])
  } else {
    member += GenerateMember().getMember(range: [[33,47],[58,64],[91,96],[123,126]], exclude: [])
  }
}
var passwd: String = ""
for n in 1...returnSet.length {
  var code: UInt32  = arc4random_uniform(UInt32(member.count))
  passwd += member[Int(code)]
}
print(passwd)
let board = NSPasteboard.general()
board.clearContents()
let item = NSPasteboardItem()
item.setString(passwd, forType: NSPasteboardTypeString)
board.writeObjects([item])

ちなみに8行目のところは、前回if文をネストして書いていたものをシンプルにしてみました。if文はBool値を複数同時に評価できないのですが、事前に全てのBool値を演算しておけば解決することに気がつきました。

コンパイルした後、どちらのコードが速いのかわかりませんが、見た目にスッキリするのは今回のものかなと思います。

コメントを残す

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