Swift倉庫

初めての投稿となりますけど、主に学習のためにまとめた便利なクラス、ファンクションなどなどをためて行きます。また、自分のクラス等を作る時のファイル名の頭にCファイル名とありますけど、これはC言語とは関係なく、自分自身の作ったファイル名につけている文字としていますので気にしないでください。

##【printlnをCLogで使用】
私はNSLogなどObj-C側で使用していた癖があるため、毎回println等を入力するのが今は面倒なので、短いCLogグローバルファンクションを使用してprintlnを読んでます。printも同様好きなファンクション名にて下記と同じように作れば問題なしです。（マクロ的な仕様ですね）

```swift:CSwiftHelper.swift
func CLog<T>(message: T) {
    println(message)
}
```

```swift:使用例
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](http://www.raywenderlich.com/75270/make-game-like-candy-crush-with-swift-tutorial-part-1)


```swift:CArray2D.swift
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
    }
  }
}
```

```swift:使用例
// 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配列：その２】
コンセプトは理解していたのですが、配列の初期設定で悩み、やっと基本的な2D配列が出来ました。こちらのやり方ですと読み書きが直接プロパティに出来ますので、使っています。

```swift:CSampleArray.swift
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を行うと配列の最後に追加されたデータから戻ってきます。

```swift:CSwiftHelper.swift
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
	}
}
```

```swift:使用例
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言語にした例も沢山出て来ています。私が一番簡単で問題なく使っている方法は下記の通りです。１行で済ませていますよ！

```swift:CSingleton.swift
let sharedCSingleton = CSingleton()  // <-- letで一度登録している
class CSingleton: NSObject {
	// クラス内容を好きに追加
	var testFlag: Bool = false
}
```

```swift:使用例
// 他のクラスでそのまま使えます。
sharedCSingleton.testFlag = true

if sharedCSingleton.testFlag {
	//.....
}
```

##【システムバージョン取得】
端末のシステムバージョンを取得します。OSXとiOS両方で使えるように工夫も行っています。

```swift:CSwiftHelper.swift
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
}
```

```swift:使用例
// 他のクラスでそのまま使えます。
var osVersion: String = getSystemVersion()
println("OSバージョン: v\(osVersion)")
```

##【デバイス種類を取得】
デバイスの種類を取得します。戻り直としてはiPhone4系、iPhone5系、iPad系とMac系となります。

```swift:CSwiftHelper.swift

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
}
```

```swift:使用例
var osDeviceType: String = getDeviceType()
println("デバイス種類: v\(osDeviceType)")
```

##【デバイスModel取得】
デバイス・モデル直を取得する。

```swift:CSwiftHelper.swift
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
}
```

```swift:使用例
let osDeviceModel: String = getMachineModel()
println("デバイスModel: \(osDeviceModel)")
```

##【デバイスModel詳細表示】
上記で取得したデバイス・モデル直を読みやすくする。今までは自分のデータ.plistを作成していましたけど、今回はMac上にある「SIMachineAttributes.plist」をそのまま読み込んで使用する事にしました。

下記のフォルダーからプロジェクト内に「SIMachineAttributes.plist」をコピーして使用する。

```file:SIMachineAttributes.plist
/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist
```

```swift:CSwiftHelper.swift
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)
}
```

```swift:使用例
let osDeviceModel: String = getMachineModel()
getPlistData(machineModel)
println("model: \(osDeviceModel)")

let (modelName, modelDescription) = getPlistData(osDeviceModel)
println("modelGroup: \(modelGroup)")
println("modelDescription: \(modelDescription)")
```

##【print/printlnで2桁の数直】

```swift:CSwiftHelper.swift
let value = 3
let text = String().stringByAppendingFormat("%.2d",value)
print(",\(text)")
```

```swift:結果
03
```
時間を見つけては追加して行きます。