Skip to content

Instantly share code, notes, and snippets.

@externvoid
externvoid / implicitlyUnwrappedOptional.swift
Last active December 16, 2015 07:28
as?, as!はどちらもdowncast、??はnilに備える演算子、?がfalseに備える演算子であるのと似ている
var a: Any? = nil
a = 2
//a = 2.0
let b = a as? Int //可能ならOptionalへ、失敗ならnil
let c = a as! Int?
//let d = a as Int? compile error!!
let d = a as? Int?
//let e = a! // forced unwrap
print(b)
print(c)
@externvoid
externvoid / 00memo.txt
Created December 17, 2015 12:59
asとas!
asの用途
1. 乗り継ぎタイプへのキャスト、即値から参照値へ変換、Swiftで導入された構造体からFoundationで定義されたクラスへ変換。
string -> nsstring
array -> NSArray
dictionary -> nsdictionary
// Brigded type casting
let string = "3"
let nsString = string as NSString
let value = nsString.floatValue // 3
逆は、クラスのコンストラクタで可能。例:NSString(string: "Convertion")
class Bar {
let someVal = 5
lazy var g:() -> String = { [unowned self] in
// lazy: 次のエラー対策:error: use of unresolved identifier 'self'
return String(self.someVal)
}
}
var bar = Bar()
print(bar.g()) // string "5"
@externvoid
externvoid / nil_expected.swift
Created December 21, 2015 07:53
nilが返るかもしれないメソッドの取り扱い
// nilが返るかもしれないメソッドの取り扱い
//let obj6 = NSUserDefaults.standardUserDefaults().objectForKey("user data")
var obj6: AnyObject? = nil
print(obj6)
var obj5 = obj6 as? [String: Int] ?? [String: Int]()
//var obj5: [String: Int] = obj! as [String: Int] ?? [String: Int]()
obj5["hp"] = 3
print(obj5) // ["hp": 3]
print(obj5.dynamicType) // Dictionary<String, Int>
@externvoid
externvoid / foo.swift
Created January 7, 2016 08:02
nilを返すかもしれないメソッドから値を受け取ってnon-optionalへ変換
nilを返すかもしれないメソッドから値を受け取る。
例:objectForKeyはAnyObject?を返す!!
[String: Int]?を[String: Int]へキャストする。
import Foundation
var obj: [String: Int]? = ["hp": 0]
print(obj)
var obj3: [String: Int] = obj! as [String: Int] ?? [String: Int]()
@externvoid
externvoid / unowned.swift
Last active May 23, 2016 07:20
swiftのキャプチャ機能[ ]とキャプチャ変数をunowned修飾する事で、循環参照を回避する。closure gからはselfを参照、MyClassのインスタンス(self)はmethod()を経由してclosure gを参照する。
class MyClass {
var x: Int = 10
func method() {
print("x = \(x)")
}
var g:()->() = {
let y = self.x
print(__LINE__,"行", String(self.dynamicType), __FUNCTION__)
print("y = \(y)")
}
@externvoid
externvoid / usingClosure.swift
Created May 18, 2016 01:40
クロージャーの定義の仕方、3通り。型推論が働くので、引数リストは不要なのかも。[unowned self]といった、selfのキャプチャはclass, struct内でのみ使用可能。
var a = 0
var b = 0
let closure0 = { [a] (b:Int)->Void in
// capture list, argument listの同時記述が出来る。
print(a, b)
}
a = -1
b = 99
@externvoid
externvoid / compare.swift
Last active May 25, 2016 01:23
compareメソッドの使い方が良く判らん⁉️▶️判った、昇順降順を判断して返してくれるって事だ。
var ar2:Array<NSString> = ["aaa", "bbb", "abc",]
var strings:NSMutableArray = NSMutableArray(array: ar2)
print(strings)
strings.sortUsingComparator( {
return $1.compare($0 as String)
} )
//error: 'AnyObject' is not convertible to 'String'; did you mean to use 'as!' to force downcast?
// return $1.compare($0 as String)
@externvoid
externvoid / displayEnum.swift
Created May 18, 2016 06:37
列挙enumの中身を表示する。rawValueではその意味が判らんので!ただし、このソースの意味がよく判らん。要解読。
import Foundation
func iterateEnum<T: Hashable>(_: T.Type) -> AnyGenerator<T> {
var cast: (Int -> T)! // reference to clousure
//print(($0).dynamicType)
// what is $0 ?, Int, 0, 1, 2, 3, 4 for nil
switch sizeof(T) {
case 0: return anyGenerator(GeneratorOfOne(unsafeBitCast((), T.self)))
case 1: cast = { unsafeBitCast(UInt8(truncatingBitPattern: $0), T.self) }
// print($0.dynamicType);print($0)
@externvoid
externvoid / dateformatter.swift
Created May 18, 2016 06:43
日付リテラルっぽいのを使ってみる。
import Foundation
var dateFmt: NSDateFormatter = NSDateFormatter()
dateFmt.dateFormat = "yyyy/MM/dd HH:mm:ss"
let date1 = dateFmt.dateFromString("2014/03/18 00:00:00")!
let date2: NSDate = dateFmt.dateFromString("2014/03/19 00:00:00")!
var order = date1.compare(date2)
print(order)
print(order == NSComparisonResult.OrderedDescending)