2016年4月21日 星期四
Swift: 給第一次碰Xcode的初學者
App coda
Swift 新手系列之一: 打造你的第一個 iOS App
http://www.appcoda.com.tw/hello-world-app-swift/
大推這個網站寫的Swift新手入門,適合給剛安裝好Xcode但還沒用過的人看!
對入門的開發學習者來說,熟悉開發平台的UI是一項不容易的事情,
我覺得Xcode很多地方設計得不錯,
像視覺化的Storyboard跟寫code的Assistant Editor可以在同一個畫面看,
互相做連結,而且不太會有變數名稱混淆的情況。
使用性越友善的開發平台就越能招到更多的開發者加入呀~~~
祝學習之路順利!
Swift: 按一下螢幕任意處就可以關掉鍵盤的方法
這個方法需要兩段code如下:
在開始前,要把整個螢幕變成一個「可控制的」屬性,請看下圖:
接下來也用截圖來說明,請試試看:
Step 1
Step 2
Step 3
(Sorry, it should be just yellow when your cursor are not on it.)
Step 4
Step 5
Step 6
Step 7
@IBAction func onExit(sender: AnyObject){
sender.resignFirstResponder()
} //這段會跟文字輸入區域有關連,要跟兩個text field連結
@IBAction func onClick(sender: AnyObject){
tf1.resignFirstResponder()
tf2.resignFirstResponder()
} //這段會跟背景的觸控有關聯,跟背景連結
在開始前,要把整個螢幕變成一個「可控制的」屬性,請看下圖:
接下來也用截圖來說明,請試試看:
Step 1
Step 2
Step 3
(Sorry, it should be just yellow when your cursor are not on it.)
Step 4
Step 5
Step 6
Step 7
2016年4月19日 星期二
Swift: Segment的操作練習
看圖理解,
Segment 就是圖中"first"跟"second"那個可以讓人點選的按鈕,
他們是歸在一組的,所以通常會是同類型的切換鈕。
這張圖的左半是畫面,右半是code,
其中三個綠框框內各代表了一個function,
他們前端都有一個灰色點,跟著箭頭指向左邊的元件,
這就是需要在Xcode中建立“圖形元件”與“function”連結的地方,
我們就可以很直觀知道哪段function會跟哪個按鈕有關聯。
實心的灰色點表示有連結到東西,空心的代表沒有連東西。
可以用按右鍵拖曳的方式,把按鈕拉到function的code上,
他就會有個框框提示跑出來,放開就可以建立連結了。
(例外註:當專案關掉再開,然後直接開.swift檔時,可能會看到空心,
這時打開StoryBoard它就會再連上,沒有的話就要再check了。)
以下是整段code:
(出自於Swift書:用Swift語言一次搞定所有蘋果裝置的程式開發 / 佳魁出版)
一面寫一面思考這些文章會對誰有幫助,坦白說這個blog很難讓初學者看了就能學會,
主要是我做學習筆記用,會把重要的部分整理成一篇文章以後複習,
Xcode的安裝、環境設定跟基本操作一般書中、網路上都有介紹,
而且一定需要自己花時間熟悉摸索,若你也是初學者,不妨看看我貼的內容,
也許多少能找到有益的資料。
一面跟著書做練習,一面撞牆,一面完成小功能,偶爾發現書中的錯誤 / bug,
或 Xcode / Swift 更新的東西,這就是學習的苦與樂吧。
繼續加油!
Segment 就是圖中"first"跟"second"那個可以讓人點選的按鈕,
他們是歸在一組的,所以通常會是同類型的切換鈕。
這張圖的左半是畫面,右半是code,
其中三個綠框框內各代表了一個function,
他們前端都有一個灰色點,跟著箭頭指向左邊的元件,
這就是需要在Xcode中建立“圖形元件”與“function”連結的地方,
我們就可以很直觀知道哪段function會跟哪個按鈕有關聯。
實心的灰色點表示有連結到東西,空心的代表沒有連東西。
可以用按右鍵拖曳的方式,把按鈕拉到function的code上,
他就會有個框框提示跑出來,放開就可以建立連結了。
(例外註:當專案關掉再開,然後直接開.swift檔時,可能會看到空心,
這時打開StoryBoard它就會再連上,沒有的話就要再check了。)
以下是整段code:
(出自於Swift書:用Swift語言一次搞定所有蘋果裝置的程式開發 / 佳魁出版)
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tv: UITextView!
@IBOutlet weak var tf: UITextField!
@IBOutlet weak var segmented: UISegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
onChanged(segmented)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func onAdd(sender: AnyObject){
let count = segmented.numberOfSegments
let title = tf.text
if title!.characters.count > 0 {
segmented.insertSegmentWithTitle(title, atIndex: count, animated: true)
}
} // 動態增加segment的函數
@IBAction func onDelete(sender: AnyObject){
let index = segmented.numberOfSegments - 1
if index > 0 {
segmented.removeSegmentAtIndex(index, animated: true)
}
} // 動態刪除segment的函數
@IBAction func onChanged(sender: AnyObject){
let index = segmented.selectedSegmentIndex
let title = segmented.titleForSegmentAtIndex(index)!
tv.text = "選取了第\(index + 1)個分段,標題是:\(title)"
} // 顯示選取的segment
}
一面寫一面思考這些文章會對誰有幫助,坦白說這個blog很難讓初學者看了就能學會,
主要是我做學習筆記用,會把重要的部分整理成一篇文章以後複習,
Xcode的安裝、環境設定跟基本操作一般書中、網路上都有介紹,
而且一定需要自己花時間熟悉摸索,若你也是初學者,不妨看看我貼的內容,
也許多少能找到有益的資料。
一面跟著書做練習,一面撞牆,一面完成小功能,偶爾發現書中的錯誤 / bug,
或 Xcode / Swift 更新的東西,這就是學習的苦與樂吧。
繼續加油!
2016年4月18日 星期一
Swift: Class 跟 繼承
繼續跟著《Swift 從入門到超人氣遊戲App開發全面修練實戰》這本書學Swift,
看到class跟繼承的用法,對於 init 不是很懂,google到Jason Kuan's Blog,
有很專業的說明,但我只稍微更懂了一點,下面的code是我理解了的部分:
(code來自於上面提到的書)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
//執行結果如下
我把上面的code分藍根綠兩色,藍代表母類別,綠代表子類別,
同樣呼叫了getName時根據各自的定義而有不同結果,
但name屬性的賦予上,子類別就繼承母類別,能方便物件的管理。
在MyPeople中func getName() -> String { return "\(name)"}這邊可看到,
-> String代表會回傳一個字串的變數回去,
return代表會推出一個東西出來,接到String那邊出去。
MyStudent的 override 應該是代表它要繼承母類別的getName(),
裡面的super.getName()就用到了母類別中定義的getName(),
傳回一個值(name)回來,再用到MyStudent裡的getName,
完成特殊需求(加上學生証號的回傳值)
這些override, super.funtion() 的語法多練幾次就會比較熟了,
看下圖再試著理解一次:
繼續加油!!!
看到class跟繼承的用法,對於 init 不是很懂,google到Jason Kuan's Blog,
有很專業的說明,但我只稍微更懂了一點,下面的code是我理解了的部分:
(code來自於上面提到的書)
-------------------------------------------------------------------------------
class MyPeople {
var name = ""
init(Name:String){
name = Name
}
func getName() -> String {
return "\(name)"
}
}
class MyStudent : MyPeople {
var StudentID = ""
override func getName() -> String {
let t_name = super.getName()
return "\(name), \(t_name)'s student ID is \(StudentID)"
}
}
var Peo1 = MyPeople(Name: "Peiwen Wu")
print(Peo1.getName())
var Peo2 = MyStudent(Name: "Bruce Wu")
Peo2.StudentID = "98381450"
print(Peo2.getName())init(Name:String){
name = Name
}
func getName() -> String {
return "\(name)"
}
}
class MyStudent : MyPeople {
var StudentID = ""
override func getName() -> String {
let t_name = super.getName()
return "\(name), \(t_name)'s student ID is \(StudentID)"
}
}
var Peo1 = MyPeople(Name: "Peiwen Wu")
print(Peo1.getName())
var Peo2 = MyStudent(Name: "Bruce Wu")
Peo2.StudentID = "98381450"
-------------------------------------------------------------------------------
//執行結果如下
Peiwen Wu
Bruce Wu, Bruce Wu's student ID is 98381450
我把上面的code分藍根綠兩色,藍代表母類別,綠代表子類別,
同樣呼叫了getName時根據各自的定義而有不同結果,
但name屬性的賦予上,子類別就繼承母類別,能方便物件的管理。
在MyPeople中func getName() -> String { return "\(name)"}這邊可看到,
-> String代表會回傳一個字串的變數回去,
return代表會推出一個東西出來,接到String那邊出去。
MyStudent的 override 應該是代表它要繼承母類別的getName(),
裡面的super.getName()就用到了母類別中定義的getName(),
傳回一個值(name)回來,再用到MyStudent裡的getName,
完成特殊需求(加上學生証號的回傳值)
這些override, super.funtion() 的語法多練幾次就會比較熟了,
看下圖再試著理解一次:
繼續加油!!!
Swift: Var是什麼東西?學寫程式的開始
我們剛開始規劃一個程式時,至少一定會有一項"任務"要由程式完成,
這個任務的定義必須很清楚,清楚到每個小螺絲釘都要逐一定義,
才能獲得正確的執行結果。
寫程式可以分成三個階段:A→B→C
A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。
下面逐一來說明。
A. 無中生有一些東西
我們的任務是 "從五個句子中,印出其中 一行句子 "
要定義的東西如下:
1. 五行句子,它們都必須有名字 (我們才能知道要呼叫誰)
2. 一個數字,也要有名字
3. "印出" 的這個功能也要定義一下
Swift的語法就是這麼用:
var str_nice = "超好吃的啦!"
var str_fine = "還不錯唷!"
var str_ok = "還可以,普通。"
var str_bad = "不怎麼樣。"
var str_awful = "難吃到我想吐..."
var star1 = 1
var star2 = 2
var star3 = 3
var star4 = 4
var star5 = 5
看到var一出現,就知道:
我要無中生有一個東西(變數),然後定義這個東西(變數)是什麼。
(var是variable的縮寫,意思是"可變的東西")
str_nice ... str_awful 這些就是自己取的變數名字;
"=" 這個符號有指定的意思;
"超好吃的啦!" 這個就是我們賦予該變數的內容;
如果上面的說明都懂了,那接下來的
var srar1 = 1
我們就知道這代表「我要生一個變數,叫做star1,它的內容是1」
注意,因為變數可以有很多種可能的類型,像數字、文字,
數字又有分很多種,所以一旦定義了它的內容之後,
就不能換類型了。電腦會根據我們賦予的內容而自動判斷變數的類型。
(字串取名str,因為str是string的縮寫,意思就是"字串")
OK,繼續下去。
B. 組合使用這些東西
print (str_nice)
這行code很明瞭的會幫我們印出 str_nice - "超好吃的啦!"
如果我們肯定知道東西一定很好吃,那今天任務可以結束,
不過若有可能跑出別的結果,我們還是得多加一點變化性。
這裡會使用到function,中文叫"函式"(詳細看這篇),
function裡面可以定義很多行為,當一次呼叫時,
它就會一次處理所有定義的動作。
func comment (words:String = "我再想想...") {
print (words)
}
comment (xxxxxxx) //這一行就是呼叫上面定義的function
當我們抽換xxxxxxx為 str_nice 或 str_bad 時,
它就會把 str_nice 或 str_bad 丟進comment裡面,
然後你看上面的{ } 中有個words變數就會把它"接住"!!
接著透過 print (words) 被印出來,任務完成!
comment (str_fine)
執行結果:
"還不錯唷!"
Q.「等等,那之前定義的 star1 ... srat5 呢?」
A.「function還有更多變化,您不妨試著探索看看。」
C. 然後產出結果
結果已經產出了,我文章寫得不是很好|||,在stage B. 中。
回顧一下,
寫程式可以分成三個階段:A→B→C
A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。
繼續加油!
這個任務的定義必須很清楚,清楚到每個小螺絲釘都要逐一定義,
才能獲得正確的執行結果。
寫程式可以分成三個階段:A→B→C
A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。
下面逐一來說明。
A. 無中生有一些東西
我們的任務是 "從五個句子中,印出其中 一行句子 "
要定義的東西如下:
1. 五行句子,它們都必須有名字 (我們才能知道要呼叫誰)
2. 一個數字,也要有名字
3. "印出" 的這個功能也要定義一下
Swift的語法就是這麼用:
var str_nice = "超好吃的啦!"
var str_fine = "還不錯唷!"
var str_ok = "還可以,普通。"
var str_bad = "不怎麼樣。"
var str_awful = "難吃到我想吐..."
var star1 = 1
var star2 = 2
var star3 = 3
var star4 = 4
var star5 = 5
看到var一出現,就知道:
我要無中生有一個東西(變數),然後定義這個東西(變數)是什麼。
(var是variable的縮寫,意思是"可變的東西")
str_nice ... str_awful 這些就是自己取的變數名字;
"=" 這個符號有指定的意思;
"超好吃的啦!" 這個就是我們賦予該變數的內容;
如果上面的說明都懂了,那接下來的
var srar1 = 1
我們就知道這代表「我要生一個變數,叫做star1,它的內容是1」
注意,因為變數可以有很多種可能的類型,像數字、文字,
數字又有分很多種,所以一旦定義了它的內容之後,
就不能換類型了。電腦會根據我們賦予的內容而自動判斷變數的類型。
(字串取名str,因為str是string的縮寫,意思就是"字串")
OK,繼續下去。
B. 組合使用這些東西
print (str_nice)
這行code很明瞭的會幫我們印出 str_nice - "超好吃的啦!"
如果我們肯定知道東西一定很好吃,那今天任務可以結束,
不過若有可能跑出別的結果,我們還是得多加一點變化性。
這裡會使用到function,中文叫"函式"(詳細看這篇),
function裡面可以定義很多行為,當一次呼叫時,
它就會一次處理所有定義的動作。
func comment (words:String = "我再想想...") {
print (words)
}
comment (xxxxxxx) //這一行就是呼叫上面定義的function
當我們抽換xxxxxxx為 str_nice 或 str_bad 時,
它就會把 str_nice 或 str_bad 丟進comment裡面,
然後你看上面的{ } 中有個words變數就會把它"接住"!!
接著透過 print (words) 被印出來,任務完成!
comment (str_fine)
執行結果:
"還不錯唷!"
Q.「等等,那之前定義的 star1 ... srat5 呢?」
A.「function還有更多變化,您不妨試著探索看看。」
C. 然後產出結果
結果已經產出了,我文章寫得不是很好|||,在stage B. 中。
回顧一下,
寫程式可以分成三個階段:A→B→C
A. 無中生有一些東西,
B. 組合使用這些東西,
C. 然後產出結果。
繼續加油!
Swift: Control Flow (Loop)
這個官方的教學網頁裡面介紹了for loop, while loop,
並且教我們用loop, while, case寫一個"蛇與階梯"(Snakes and ladders)的遊戲,
非常適合初學者學完基礎後,想知道怎麼把它們組合起來,
程式長度約幾十行,不妨跟著教學走走看!
(圖片取自:Apple官方Swift教學網頁)
並且教我們用loop, while, case寫一個"蛇與階梯"(Snakes and ladders)的遊戲,
非常適合初學者學完基礎後,想知道怎麼把它們組合起來,
程式長度約幾十行,不妨跟著教學走走看!
(圖片取自:Apple官方Swift教學網頁)
2016年4月17日 星期日
Swift: function的基本
以下是一個最簡單swift function的例子:
var word = "hello!!!!!" //定義一個叫做word的字串內容為"hello!!!!!"
func sayhello(str:String = "Yes!!"){
print(str)
} //定義一個叫做say hello的function能夠印出代入的字串
sayhello(word) //把word字串代入say hello中並且呼叫sayhello
sayhello() //沒有字串代入sayhello,所以代入預設的"Yes!!"(參照上面的code)
===========程式執行結果=============
hello!!!!!
Yes!!
===========程式執行結果=============
我們寫程式的時候,有時遇到複雜的結構,code越寫越多,會越難管理,
function的好處,在於先定義一個「行為包」,一個程式可以有好多個行為包,
等到需要用的時候就呼叫這個「包」,對開發的人來說,再落落長的程式行為都能清楚畫分。
另一個好處,就是需要修改時,可以很清楚不會改到其他functions。
最上面短短的六行程式中,
第一行 var word = "hello!!!!!"
定義了一個「變數」(variable),可以是數字或是字串(定義var請看這篇)
第二~四行 定義了一個function
func sayhello(){
print("hello")
}
這裡說明一下二~四行的結構:
func //即將要定義一個function
sayhello() //取function名字為sayhello, ()裡面可以定義要代入的預設變數,或是空著
{ print("hello") } //{ }定義function裡面做的行為
第五、六行就不用再說明,請參考上面就有的註解囉!
我們在下面再練習一個function的例子:
var greeting = "yoyo!"
func speak(content:String = "Hi."){
print(content)
}
speak(greeting) // 會印出: yoyo!
speak() // 會印出: Hi.
Swift: 在字串中抽換特定字元
在找問題時翻到這段code,覺得蠻有用,記錄起來:
(抱歉因為中途關掉網頁,若有違原出處請見諒)
let puzzleInput = "great minds think alike"
var puzzleOutput = ""
for character in puzzleInput.characters {
switch character {
case "a", "e", "i", "o", "u", " ":
continue
default:
puzzleOutput.append(character)
}
}
print(puzzleOutput)
執行結果如下:
grtmndsthnklk
Swift: for / for in (range) loop
現在剛開始學swift,剛安裝了Xcode(7.3),覺得它的介面還頗友善,可以在下方即時顯示執行的code。
在跟著書(書名很長,碁峯出版,作者柯博文)一面試基本的操作語法,發現有些跟書不一樣了,可能是swift本身有在更新,像for迴圈:
書上寫:
for var index = 0 ; index < 3; index++ {
print("index is \(index)")
}
執行結果會是
index = 0
index = 1
index = 2
但即時編譯時跑出訊息說以後不再支援這種像C的寫法,
會改成:
for index in 0 ..< 3 {
print("index is \(index)")
}
(注意第一行0 ..< 3空格的地方要對)
精省也直覺了不少,而且不用像VB要dim(宣告)東西一樣先用var定義。
下面講另一種範圍的loop,
書上寫:
for index in range(3):
print("index = \(index)")
現在也行不通了,要改成:
for index in 4 ... 6 {
print("index = \(index)")
}
結果就會是:
index = 4
index = 5
index = 6
2016年4月15日 星期五
VB 可以切換的頁面
我想做一個像下圖中,上排可以切換不同的畫面,
例如從商品出貨的頁面切到商品進貨的頁面。
'以下撞牆過程,沒時間可以直接忽略
'這個MSDN的網頁有教怎麼做能切換的兩個form,
'但是會開啟一個,關掉一個,而且不是在同個位置,
'對我來說頗為不實用。
'然後我google了"vb form switch",找到這個網頁(stack overflow),提問的人描述:
'"...in short I want the user to get a feel that he is working on one form only..."
'恩,這就是我要的。
'shit... 但是我看不懂。User Control(使用者控制項什麼的)把我考倒了。
'以上撞牆過程結束
'以下最佳解答
google"vb 切換 頁面"找到這個叫Level Up的網站,
裡面提到其實內建的 tabControl 就可以達到我的需求!
把它拉進畫面就可以了,參數再慢慢調
右下角這裡點下去
每個page都可以在這裡調整
表面上就暫時成了,接下來要研究怎麼在這些子頁面中做更多動作。
例如從商品出貨的頁面切到商品進貨的頁面。
'以下撞牆過程,沒時間可以直接忽略
'這個MSDN的網頁有教怎麼做能切換的兩個form,
'但是會開啟一個,關掉一個,而且不是在同個位置,
'對我來說頗為不實用。
'然後我google了"vb form switch",找到這個網頁(stack overflow),提問的人描述:
'"...in short I want the user to get a feel that he is working on one form only..."
'恩,這就是我要的。
'shit... 但是我看不懂。User Control(使用者控制項什麼的)把我考倒了。
'以上撞牆過程結束
'以下最佳解答
google"vb 切換 頁面"找到這個叫Level Up的網站,
裡面提到其實內建的 tabControl 就可以達到我的需求!
把它拉進畫面就可以了,參數再慢慢調
右下角這裡點下去
每個page都可以在這裡調整
表面上就暫時成了,接下來要研究怎麼在這些子頁面中做更多動作。
訂閱:
文章 (Atom)