初めての投稿となりますけど、主に学習のためにまとめた便利なクラス、ファンクションなどなどをためて行きます。また、自分のクラス等を作る時のファイル名の頭にCファイル名とありますけど、これはC言語とは関係なく、自分自身の作ったファイル名につけている文字としていますので気にしないでください。
##【printlnをCLogで使用】
私はNSLogなどObj-C側で使用していた癖があるため、毎回println等を入力するのが今は面倒なので、短いCLogグローバルファンクションを使用してprintlnを読んでます。printも同様好きなファンクション名にて下記と同じように作れば問題なしです。(マクロ的な仕様ですね)
func CLog<T>(message: T) {
println(message)
}
println("INT_MAX: \(INT_MAX)")
CLog("INT_MAX: \(INT_MAX)")
CLog("LONG_MAX: \(LONG_MAX)")
CLog("sizeof(Int): \(sizeof(Int))")
CLog("sizeof(Int8): \(sizeof(Int8))")
##【2D配列】
2D配列が行えるクラスです。参考元は下記のリンクとなります。
RAYWENDERLICH: How to Make a Game Like Candy Crush with Swift Tutorial: Part 1
class CArray2D<T> {
var columns: Int
var rows: Int
var array: Array<T?> // private
init(columns: Int, rows: Int) {
self.columns = columns
self.rows = rows
array = Array<T?>(count: rows*columns, repeatedValue: nil)
}
subscript(column: Int, row: Int) -> T? {
get {
return array[row*columns + column]
}
set {
array[row*columns + column] = newValue
}
}
}
// Int仕様の配列登録
var array1 = CArray2D<Int>(columns: 5, rows: 5)
// String仕様の配列登録
var array2 = CArray2D<String>(columns: 5, rows: 5)
// オブジェクト仕様の配列登録
var array2 = CArray2D<AnyObject>(columns: 5, rows: 5)
// 直設定
array1[0,1] = 10
array2[0,1] = "My Text"
##【2D配列:その2】
コンセプトは理解していたのですが、配列の初期設定で悩み、やっと基本的な2D配列が出来ました。こちらのやり方ですと読み書きが直接プロパティに出来ますので、使っています。
struct CData {
var type: Int
var number: Int
init() {
self.type = 0
self.number = 0
}
}
class ArrayTest: NSObject {
var dataArray: [[CData]] = []
init() {
super.init()
// 配列の初期設定・ストラクチャー内にてinit()をかけています
for column in 0..<5 {
dataArray.append(Array(count:5, repeatedValue:CData()))
}
println("-- 変更前 --")
println("dataArray[1][3].type: \(dataArray[1][3].type)")
println("dataArray[1][3].number: \(dataArray[1][3].number)")
dataArray[1][3].type = 4
dataArray[1][3].number = 1
println("-- 変更後 --")
println("dataArray[1][3].type: \(dataArray[1][3].type)")
println("dataArray[1][3].number: \(dataArray[1][3].number)")
}
}
##【PUSH/POP仕様配列】
配列にデータをPUSHした準に追加され、POPを行うと配列の最後に追加されたデータから戻ってきます。
struct CStack<T> {
var items = [T]()
mutating func push(item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
mutating func count() -> Int {
return items.count
}
}
var stackMap = CStack<Int>()
var value = 1
stackMap.push(value)
stackMap.push(3)
stackMap.push(8)
stackMap.push(5)
value = stackMap.pop() // value = 5
value = stackMap.pop() // value = 8
value = stackMap.pop() // value = 3
value = stackMap.pop() // value = 1
##【Singleton簡単版】
Obj-Cでよく使われるシングルトンにも様々なやり方がありますけど、それらをSwift言語にした例も沢山出て来ています。私が一番簡単で問題なく使っている方法は下記の通りです。1行で済ませていますよ!
let sharedCSingleton = CSingleton() // <-- letで一度登録している
class CSingleton: NSObject {
// クラス内容を好きに追加
var testFlag: Bool = false
}
// 他のクラスでそのまま使えます。
sharedCSingleton.testFlag = true
if sharedCSingleton.testFlag {
//.....
}
##【システムバージョン取得】
端末のシステムバージョンを取得します。OSXとiOS両方で使えるように工夫も行っています。
func getSystemVersion() -> String {
#if os(iOS)
return UIDevice.currentDevice().systemVersion
#elseif os(OSX)
let pinfo: NSProcessInfo = NSProcessInfo.processInfo()
let version: String = pinfo.operatingSystemVersionString
return version
#else
return "Unknown"
#endif
}
// 他のクラスでそのまま使えます。
var osVersion: String = getSystemVersion()
println("OSバージョン: v\(osVersion)")
##【デバイス種類を取得】
デバイスの種類を取得します。戻り直としてはiPhone4系、iPhone5系、iPad系とMac系となります。
func getDeviceType() -> String {
#if os(iOS)
screenSize.width = UIScreen.mainScreen().bounds.size.width
screenSize.height = UIScreen.mainScreen().bounds.size.height
if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
if screenSize.width == 568.0 || screenSize.height == 568.0 {
return "iPhone5"
}
return "iPhone4"
} else {
return "iPad"
}
#else
return "Mac"
#endif
}
var osDeviceType: String = getDeviceType()
println("デバイス種類: v\(osDeviceType)")
##【デバイスModel取得】
デバイス・モデル直を取得する。
func getMachineModel() -> String {
#if os(iOS) && !(arch(arm) || arch(i386))
let name = "hw.machine"
#else
let name = "hw.model"
#endif
//Cの文字列を作成
// let cName = name.bridgeToObjectiveC().UTF8String // Beta5から使えない
let cName = (name as NSString).UTF8String // Beta5からこれを使う
//サイズを取得 (size_tの代わりにUInt)
var size: UInt = 0
sysctlbyname(cName, nil, &size, nil, 0)
//取得したサイズでCCharの配列を初期化
var machine = [CChar](count: Int(size)/sizeof(CChar), repeatedValue: 0)
//値を取得
sysctlbyname(cName, &machine, &size, nil, 0)
//Stringに変換
return NSString(bytes: machine, length: Int(size-1), encoding: NSUTF8StringEncoding) as String
}
let osDeviceModel: String = getMachineModel()
println("デバイスModel: \(osDeviceModel)")
##【デバイスModel詳細表示】
上記で取得したデバイス・モデル直を読みやすくする。今までは自分のデータ.plistを作成していましたけど、今回はMac上にある「SIMachineAttributes.plist」をそのまま読み込んで使用する事にしました。
下記のフォルダーからプロジェクト内に「SIMachineAttributes.plist」をコピーして使用する。
/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist
func getPlistData(model: String) -> (String, String) {
var plistPath = NSBundle.mainBundle().URLForResource("SIMachineAttributes", withExtension:"plist")
let dict = NSDictionary(contentsOfURL:plistPath)
var modelName = ""
var modelDescription = ""
if dict.objectForKey(model)? {
modelName = dict.objectForKey(model).objectForKey("_LOCALIZABLE_").objectForKey("model") as String
modelDescription = dict.objectForKey(model).objectForKey("_LOCALIZABLE_").objectForKey("description") as String
} else {
modelName = "Unknown"
modelDescription = "Unknown"
}
return (modelName, modelDescription)
}
let osDeviceModel: String = getMachineModel()
getPlistData(machineModel)
println("model: \(osDeviceModel)")
let (modelName, modelDescription) = getPlistData(osDeviceModel)
println("modelGroup: \(modelGroup)")
println("modelDescription: \(modelDescription)")
##【print/printlnで2桁の数直】
let value = 3
let text = String().stringByAppendingFormat("%.2d",value)
print(",\(text)")
03
時間を見つけては追加して行きます。