配列のインデックスはInt型だった

投稿者: | 2017年2月20日

mkPassの心臓部、与えられた文字セットの中から任意の文字を抽出するコードをPasswordクラスにしました。

文字セットは一文字を要素とする配列になります。任意の要素を抽出するために、配列のインデックスを乱数で生成しています。

import Foundation
class Password {
  private var password: String      // get method returns password string from character data set.
  private var returnCode: Int32
  init(password: String = "", returnCode: Int32 = 0) {
    self.password = password
    self.returnCode = returnCode
  }
  func get(member:[Character], length:Int) -> (String) {
    var code: UInt32
    for _ in 1...length {
      code = arc4random_uniform(UInt32(member.count))
      password += "\(member[Int(code)])"
    }
    return password
  }
}

乱数を生成する同様に乱数生成メソッドarc4random_uniformを使ったのですが、これの戻り値はUInt32になります。この値を文字セット配列のインデックスとして与えるとコンパイルエラーに。。。

いろいろ試した結果、Int型に変換してやるとOKでした。配列のインデックスなんて負の値なんかないだろう?と思っていたんですが、よくよく考えたら型推論のデフォルト値であるIntを採用するのはあたりまえか。。。

ちなみにテストコードはこんな感じ。

#! /usr/bin/swift
import Foundation
var condition: (member:[Character], length:Int) = (["1","2","3","4","5"],50)
var result: String
var status: Int = 0
var check: Bool
result = Password().get(member:condition.member, length:condition.length)
print("Seeds:\(condition.member), Length:\(condition.length)")
print("Result:\(result)")
for i in result.characters {
  check = false
  for j in condition.member {
    if i == j {
      check = true
    }
  }
  if check == false {
    status |= 1
  }
}
if status != 1 {
  print("\u{001B}[0;32mCharacters check is passed.\u{001B}[0;30m")
} else {
  print("\u{001B}[0;31mCharacters check is failed.\u{001B}[0;30m")
}
if result.characters.count != condition.length {
  status |= 2
  print("\u{001B}[0;31mLength check is failed.\u{001B}[0;30m")
} else {
  print("\u{001B}[0;32mLength check is passed.\u{001B}[0;30m")
}

文字列長のチェックと、文字列内に指定外の文字がないかどうかを確認しています。

コメントを残す

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