HexClockというサイトを見つけました・ω・
どうやら背景が時計の時間・分・秒で構成された6桁の数字の色になるサイト。
面白い>ω<
ので、アプリにしてみた。
さて、これをせっかくなのでSwiftにするべく奮闘していこうと思いまする。
Objective-CのコードをSwiftへ切り替えていく
カテゴリ作成
UIColorを拡張してHexのStringからUIColorを生成する関数を追加する形をとってます。
Swiftでのカテゴリはextension
でいいのかな?
ファイル名はUIColor+Hex.swift
でいいのかな?
とりあえずUIColor+Hex.swift
にしてみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| 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を使って
1
2
3
4
5
| self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01
target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];
|
と書いていたところをSwiftにするには・・・。
1
| self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01,target:self, selector:"onTimer", userInfo:nil, repeats:true)
|
1
2
3
| func onTimer(){
println("Timer")
}
|
こんな形になりました。
引数つきのセレクタってどうするんだろう・・・Σ
とりあえずこれでいく!!
と思ったら記事にしていただいている方たいらっしゃいました。
⇒SwiftでiOS SDKの「複数の引数がある@selector」を使う方法。
普通に:
つけるだけでした
1
| self.timer = NSTimer.scheduledTimerWithTimeInterval(0.01,target:self, selector:"onTimer:", userInfo:nil, repeats:true)
|
1
2
3
| func onTimer(timer:NSTimer){
println("Timer")
}
|
そりゃそうだ。ちょっと寝ぼけてた・ω・`
問題がおきた
さて。
ここに一応Objective-CのソースとSwiftのソース(プロジェクトファイルからはSwiftを参照するようになってまする)を置いてあるわけですが・・・
Objective-Cのソースをそのまんまの形でSwiftにしたんだけど(不要なViewつくってたのでそれはなくした)画面がチカチカ点滅するようになってしまいましたorz
原因
onTimerの中の処理を
1
2
3
4
5
| 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
とかしちゃってたのがだめなのかと思って統一してみても駄目でした。
1
2
| class func color(hex: Int) -> UIColor
class func color(hex:String) -> UIColor
|
playgroundで同じ状況を作ってみる。
1
2
3
4
5
6
7
8
9
10
11
12
| class SampleClass {
class func testFunc(a:String){
println("String")
}
class func testFunc(a:Int){
println("Int")
}
}
SampleClass.testFunc("TEST")
SampleClass.testFunc(123)
|
出力結果は
うぅむ・・・わからないΣ
解決
Optional Valueをつけてないのが原因だったみたい?です。
1
2
| class func color(hex: Int!) -> UIColor
class func color(hex:String!) -> UIColor
|
引数のところに!
をつけるといけましたΣ
うぅむ・・・!!!!
まだ慣れない。
ということでここで一旦完成です。
お世話になりました