Edited at

Objective-Cで作ったのをSwiftにする記録(ぷちプログラム)

More than 5 years have passed since last update.

ブログ⇒背景が時計のHexColorになる時計

の記事をkobitoで書いたのでせっかくだからQiitaにも投稿。

(とおもったらQiita Team使ってる人はどうだのエラーが出てきて投稿できなかったのでWebから投稿・・・。)

HexClockというサイトを見つけました・ω・

どうやら背景が時計の時間・分・秒で構成された6桁の数字の色になるサイト。

面白い>ω<

ので、アプリにしてみた。

https://github.com/PGMY/HexColorWatch

さて、これをせっかくなのでSwiftにするべく奮闘していこうと思いまする。


Objective-CのコードをSwiftへ切り替えていく


カテゴリ作成

UIColorを拡張してHexのStringからUIColorを生成する関数を追加する形をとってます。

Swiftでのカテゴリはextensionでいいのかな?

ファイル名はUIColor+Hex.swiftでいいのかな?

とりあえずUIColor+Hex.swiftにしてみます。

extension UIColor {

class func color(hex: Int) -> UIColor{
let red :CGFloat = CGFloat(((hex & 0xff000000) >> 24))/225.0
let green :CGFloat = CGFloat(((hex & 0x00ff0000) >> 16))/225.0
let blue :CGFloat = CGFloat(((hex & 0x0000ff00) >> 8))/225.0
let alpha :CGFloat = CGFloat((hex & 0x000000ff))/225.0
return UIColor(red: red, green: green, blue: blue, alpha: alpha)
}
class func color(hexString:String) -> UIColor {
var hex:UInt32 = 0x0;
var scanner:NSScanner = NSScanner(string: hexString)
scanner.scanHexInt(&hex)
return self.color(Int(hex))
}
}

こんな感じかな?

関数名の付け方がまだいまいちですorz

とりあえずこれで行きます・ω・´


NSTimerをセットする

しまったセレクタの書き方がわからないΣ

Objective-Cでいう@selector(hoge:)の部分。

Timerを使って

self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01

target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];

と書いていたところをSwiftにするには・・・。

self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01,target:self, selector:"onTimer", userInfo:nil, repeats:true)

func onTimer(){

println("Timer")
}

こんな形になりました。

引数つきのセレクタってどうするんだろう・・・Σ

とりあえずこれでいく!!

と思ったら記事にしていただいている方たいらっしゃいました。

SwiftでiOS SDKの「複数の引数がある@selector」を使う方法。

普通に:つけるだけでした

self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01,target:self, selector:"onTimer:", userInfo:nil, repeats:true)

func onTimer(timer:NSTimer){

println("Timer")
}

そりゃそうだ。ちょっと寝ぼけてた・ω・`


問題がおきた

さて。


https://github.com/PGMY/HexColorWatch

ここに一応Objective-CのソースとSwiftのソース(プロジェクトファイルからはSwiftを参照するようになってまする)を置いてあるわけですが・・・

Objective-Cのソースをそのまんまの形でSwiftにしたんだけど(不要なViewつくってたのでそれはなくした)画面がチカチカ点滅するようになってしまいましたorz


原因

onTimerの中の処理を

var df : NSDateFormatter = NSDateFormatter()

df.dateFormat = "HHmmss"
var str:String = df.stringFromDate(NSDate.date())
self.backGroundView!.backgroundColor = UIColor.color(str+"FF")
self.hexWatchLabel!.text = "#"+str

こんな形にしていました。

が、呼び出したかったclass func color(hexString:String) -> UIColorではなく、class func color(hex: Int) -> UIColorに入ってきてたのが原因でした。

ほむ・・・

片方の引数をhexStringとかしちゃってたのがだめなのかと思って統一してみても駄目でした。

class func color(hex: Int) -> UIColor

class func color(hex:String) -> UIColor

playgroundで同じ状況を作ってみる。

class SampleClass {

class func testFunc(a:String){
println("String")
}

class func testFunc(a:Int){
println("Int")
}
}

SampleClass.testFunc("TEST")
SampleClass.testFunc(123)

出力結果は

String

Int

うぅむ・・・わからないΣ


解決

Optional Valueをつけてないのが原因だったみたい?です。

class func color(hex: Int!) -> UIColor

class func color(hex:String!) -> UIColor

引数のところに!をつけるといけましたΣ

うぅむ・・・!!!!

まだ慣れない。

ということでここで一旦完成です。


お世話になりました