2014年6月18日

Swift筆記:Objects and Classes

使用class和類別名稱來建立類別。
class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

要建立一個class的實體,在類別名稱後面加上小括號。
用點來存取屬性和方法。
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
使用init建立建構子。
class NamedShape {
    var numberOfSides: Int = 0
    var name: String

    init(name: String) {
        self.name = name
    }

    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}
建立類別實體的時候,每個屬性都要被賦值。可以透過宣告的方式numberOfSides或是建構子name)。

如果你需要在删除實體之前進行一些清理工作,使用deinit建立解構子。
子類別的定義方法是在類別名稱後面加上父類別的名字,用冒號分割。建立類別不一定要指定父類別。
子類別如果要覆寫父類別的方法,需要用override——如果没有添加override就覆寫父類別方法的話編譯器會報錯。同樣的,編譯器也會檢查override是否存在父類別中。
class Square: NamedShape {
    var sideLength: Double

    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }

    func area() ->  Double {
        return sideLength * sideLength
    }

    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

Swift筆記:Functions and Closures

宣告函數使用func,呼叫funciton使用名字、參數。使用->指定return型態。
func greet(name: String, day: String) -> String {
    return "Hello \(name), today is \(day)."
}
greet("Bob", "Tuesday")

多個return值的寫法
func getGasPrices() -> (Double, Double, Double) {
    return (3.59, 3.69, 3.79)
}
呼叫方式:
getGasPrices()
function可以帶不定個數的數值當作參數
func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
呼叫方式:
sumOf()
sumOf(42, 597, 12)

function裡面可以包含其他的function,內層的function可以使用外層的變數,如果一個function較複雜的時候可以用這種方式來做簡化。
func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}

function本身可以當作參數,也能當作return值
當作return值的範例:

func makeIncrementer() -> (Int -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
當作參數的範例:
func hasAnyMatches(list: Int[], condition: Int -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(numbers, lessThanTen)
可以使用{}來建立一個匿名函數closures。使用in把參數和return類型和function本身的內容分開。
numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})
如果匿名函數中只有一行,就會自動將這一行的數值當成return值。

2014年6月17日

Swift筆記:Control Flow

原本在Objective-C中的for (a  in  Array)的小括號可以省略,變成
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}

在if裏面,判斷式必須要是布林表示,所以 if a{....}這樣的方式會錯誤,a不會自動和0做比較。

for...in也可以用在dictionary上,例如
let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
可以用...來表示範圍,例如
var firstForLoop = 0
for i in 0..3 {
    firstForLoop += i
}

Swift筆記:Simple Value

Value
let ,常數,編譯的時候不需要有值,但只能給一次值。
var,變數

編譯器會自動判斷value的類型,例如
var myVariable = 42
編譯器會自動判斷myVariable為整數

如果要指定值的類型,要在數值名稱後面加上類型,用冒號區隔。
let explicitDouble: Double = 70

Swift不會自動轉換類型,因此要強制轉換類型,
let label = "The width is"
let width = 94
let widthLabel = label + String(width)
轉換成String還可以用\(Variable)
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

Array和Dictionary的使用方法
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
Array和Dictionary的初始化方法
let emptyArray = String[]()
let emptyDictionary = Dictionary<String, Float>()



2012年12月18日

[iPhone]Background Setting

今天在設定UITableView的background,發現了如果設定image為table view的background,
每個section之間會有被截斷的感覺,
測試之後發現直接設定UIWindow 的background,接下來把所有的view背景設為透明才是最快變換背景的方法。

在didFnishLaunchingWithOptions裡面加上
[window setBackgroundColor: [[UIClolor alloc] initWithPatternImage:[UIImage imageName:@"imagename.png" ] ] ];

接下來在每一個頁面設定background為clearColor,就完成背景的更改囉。