顯示具有 swift 標籤的文章。 顯示所有文章
顯示具有 swift 標籤的文章。 顯示所有文章

2016年12月21日 星期三

「Swift」Label.text 顯示數值

有時候,想要把數值 (int  , double )顯示在Label上,

都需要先變成String , 可以透過一個簡單的方法,在輸出時轉成字串


"\(數值變數)"   ,如下所示


 var a:Int = 10
        

 mLabel.text = "\(a)"



2016年12月16日 星期五

2016年12月10日 星期六

[Swift]取得Label.text長度

取得Label.text內容的長度


var str = labelTel.text!
        
let intValue: Int = str.startIndex.distanceTo(str.endIndex)


參考資料:



Convert String.Index to Int or Range<String.Index> to NSRange
http://stackoverflow.com/questions/28128554/convert-string-index-to-int-or-rangestring-index-to-nsrange

2015年10月5日 星期一

「Swift」Swift建構與解構

Swift建構子是init() ,解構子是deinit ,在學Swift之前,我真的沒聽過解構這名詞。


class Employee
{
    var Name : String = ""
 
    init()
    {
        print("建構了")
    }
    
    deinit
    {
        print("解構了")
    }
}

然候建構及解構


var emp : Employee?

emp = Employee()
emp!.Name = "boywhy"
emp = nil

注意宣告時,必須把型別宣告成Employee? (Optional),最後才能被指定成nil

輸出結果為

建構了解構了

「swift」set 及 get用法

今天假如我有一個變數,需要做計算屬性 ,

假如某個員工薪水低於30K,就給員工30K。

我們先用Swift建立一個class叫做Employee


public class Employee
{
    var Name : String = ""
    private var _Salary : Int = 0
    var Salary : Int{
        set {
            if newValue < 30000
            {
                self._Salary = 30000
            }
            else
            {
                self._Salary = newValue
            }
        }
        get
        {
            return self._Salary
        }
    }
}
然候我們初始化員工的資料


var emp : Employee

emp = Employee()
emp.Name = "boywhy"
emp.Salary=23000
print("Name:\(emp.Name) Salary :\(emp.Salary)")

輸出結果為 Name:boywhy Salary :30000

2015年8月26日 星期三

[swift]swift 筆記6 - enum

以下是一個基本的列舉範例

enum Operator
{
    case ADD
    case EDIT
    case DELETE
    case SELECT
}


你也可以一行寫完它




enum DataOperator
{
    case ADD,DELETE,EDIT,SELECT
}






使用方法
var Op = Operator.EDIT

以下是一個錯誤範例,swfit很嚴謹,在switch case的情況下,

你必須使用全部的列舉項目,不然就要加上default才行


//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
}

以下二種寫法都是正確的


//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
case .SELECT:
    break
}

//多重分支控制 (要嘛寫default 要嘛全部列舉選項都要寫)

switch Op{
    
case .ADD :
    break
    
case .DELETE:
    break

case .EDIT:
    break
    
default :
    break
}

亦可定在定亦列舉時給定參數


//聯合值
enum BarCode
{
    case QRCODE(String)
    case UPCA(Int,Int ,Int)
}

//定義一個變數barcode
var qr = BarCode.UPCA(12345, 22222, 9)
//判斷這一個列舉值
switch qr
{
case .QRCODE(let url) :
    print("網址\(url)")
    break
case .UPCA(let number , let indentifier , let check):
    print("系統號:\(number) 識別碼:\(indentifier)檢查:\(check)")
    break;
}


2015年8月8日 星期六

「swift」筆記5 - function

1.以下是一個function,傳入值為String (傳入名稱為message,

回傳值亦為String(->表示回傳值型態), func是關鍵字

func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}


//function call
var result1 = helloWorld("Eric")


回傳值為"Eric Hello World",\(變數名稱)  是用來做pattern String

2.以下是一個沒有回傳值的function


func printData(message:String)
{
    print(message)
}

printData("北七BLOG")


會印出北七BLOG,但不會回傳值。

3.多個參數的function


func helloWorl (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

var result2 = helloWorl("你好", "bill")


輸出為 "bill say ... 你好"

4.多個回傳值的function


func comsitInformation(who : String , salary : Int , address : String ) ->(who  : String ,salary : Int ,address : String )
{
    var whoMsg = who + "你好"
    var curSalary = salary + 10000
    var result = (whoMsg,curSalary,address)
    
    return result
}

var result = comsitInformation("boy" , 100 , "高雄市前鎮區")

print(result.who)

輸出為"boy你好" ,它的會回傳是一個具名元組,可以用名稱取得內容。

EX: result.who、 result.salary、 result.address

5.function 亦支援overLoading

可以允許同名的function但參數型別、數量不同。


func helloWorld(message : String) ->String
{
    return "\(message) Hello World"
}
//overLoading
func helloWorld (message : String , who : String )  ->String
{
    return "\(who) say ... \(message)"
}

//function call
var result1 = helloWorld("Eric")

//call stong Typed function paramters
var result2 = helloWorld("你好", "bill")

6.變動參數長度,和JAVA的AsyncTask 輸入參數類似


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var result3 = calc(10,20,55,55)

var result3 = calc(16,22)


7.function的參數預設的情況下是常數,不允許變更自身的值

//預設是常數,要改值要改成變數
func passingPocess(var #v1 : Int32 ,var  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
    
    print("new value: v1:\(v1) v2:\(v2)")
}

var lvar1 : Int32 = 100
var lvar2 : Int32 = 200

passingPocess(v1 : lvar1 , v2 :  lvar2)

如果你需要提供外部參數名,但是局部參數名已經定義好了,那麼你不需要寫兩次這些參數名。相反,只寫一次參數名,並用井字號(#)作為前綴就可以了。這告訴 Swift 使用這個參數名作為局部和外部參數名。

8.傳址參數

func passingPocess(inout #v1 : Int32 ,inout  #v2 :Int32)
{
    v1 = v1 * 100
    v2 = v2 * 100
}

passingPocess(v1 : &lvar1 , v2 :  &lvar2)
//call by referece inout
print("old value: lvar1:\(lvar1) lvar2:\(lvar2)")

9.定義函數型別(function當作一個Type)


func calc(values : Int...)->Int
{
   
    var myTOtal : Int = 0
    
    //走訪
    print("total:\(values.count)")
    for value in values
    {
        myTOtal += value
    }
    
    return myTOtal
}

var calProxy :(Int...) -> Int = calc

var returntotal = calProxy(1,2,3,4,5)

calProxy即為我們定義的函數型別

亦可寫的更加精簡

//不寫參數也可以
var calProxy2 = calc
var returntotal2 = calProxy2(1,2,3,4,5)

10.函式當成參數傳遞


func addTwoInts(a: Int, b: Int) -> Int {
    return a + b
}

var mathFunction: (Int, Int) -> Int = addTwoInts

func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
    println("Result: \(mathFunction(a, b))")
}
printMathResult(addTwoInts, 3, 5)
// prints "Result: 8」

參考來源:

http://tommy60703.gitbooks.io/swift-language-traditional-chinese/content/chapter2/06_Functions.html

「swift」筆記4 - Loop

1.while loop


var result:Bool=true
var loop:Int = 1

//條件式迴圈Conditional

while result
{
    print("success")
    
    loop++
    
    if loop == 100
    {
        break
    }
    
}

2.do while loop

//do whele conditional

do
{

    
}while result == false

3.for loop

var p:Int

for p = 1 ; p <= 10 ; p++
{
    println(p)
}

4. for in


//array 用中括號
var names=["allen","bill" , "candy" , "eric" , "frank"]

//name不需要用var ,但在這裡name它還是區域變數
for  name in names
{
    print(name)
}

5.for in 並不會給定變數初始值,以下這段CODE會出錯




















可以將變數宣告成Optional來解決(Optional會自動初始化為nil)

[Swift]筆記3 -String

1.建構方式建立空字串的方式


var myName : String = String() //Structure

2.在Swift中,String是值型別,並不是參考型的物件,

所以可以直接用==來做內容的比較。


var name1 , name2 : String
name1 = "Eric"
name2 = "Eric"

if name1 == name2
{
    print("equ")
}
else
{
    print("no equ")
}

3.可以把字串的內容當成字元一個一個輸出


var myName : String = String()

myName = "北七部落"

for character in myName
{
    print(character)
}


4. 串接字串


var myName : String = String()

myName = "北七部落"

myName + " Hello world"

print (myName)

5.unicode scalar


var myName : String = String() 

myName = "北七部落"

for uni in myName.unicodeScalars
{
    print(uni)
}

6.String在Swift中是一個Struct,類別有的功能它都有,但沒有繼承性,

相對也較節省記憶體,但延伸應就沒那麼廣。

var myName : String = String() 

myName = "北七部落"

var isEmpty =  myName.isEmpty

7. SubString

Swift的subString並不是直接給index,必須要先透過advance產生String.index

以是這段是由第3個位置開始取到字串結尾


let index=advance(myName.startIndex , 3)

myName.substringFromIndex(index)


8.以array方式取出字串某一個字元(一樣要透過advance產生String.index)


var myName : String = String() 

myName = "北七部落"

let index=advance(myName.startIndex , 3)

var char = myName[index]

9.由陣列中找出字串開頭符合的結果


var addr = ["高雄市三民區" , "台南市安南區" , "高雄市前鎮區"]

//for in 
for add in addr
{
    if add.hasPrefix("高雄市")
    {
        print(add)
    }
}


找出字串結尾結尾符合

var addr = ["高雄市三民區" , "台南市安南區" , "高雄市前鎮區"]

//for in
for add in addr
{
    if add.hasSuffix("三民區")
    {
        print(add)
    }
}

10.大小寫轉換

//upcast
var caseStrig = myName.uppercaseString

//lowcast
var caseString2 = caseStrig.lowercaseString


2015年8月4日 星期二

[swift] 筆記2

1.宣告一個Optional Int  會自動被初始化成nil,一般的區域變數並不會被自動初始













2.在swift中數值相加必須是相同型別才行(不會自動把Int8轉成Int16)









必須先將型別轉成相同才能運算, 型別(要轉型的變數)

























3. 在swift中Int是會隨著32/64 bit OS 而有不同,在32時相當於Int32,在64時相當於Int64

4.區間運算

以下程式碼等同於for迴圈輸出1~10

 //區間運算 3個點(含頭跟尾巴)  
 for index in 1...10  
 {  
   print(index)  
 }  

半封閉區間運算
 //半封閉式區間 2個點(含頭不含尾)  
 for p in 1..<10  
 {  
   println(p)  
 }  

5. &&運算

 if 100<200 && 300<400  
 {  
   println("yes")  
 }  

6.if條件判斷
 var a = 10  
 var b = 20  
 if a == b  
 {  
   println("equ")  
 }  
 else  
 {  
   println("no equ")  
 }  

7. typealias

用typealias 將型別取上別名

 typealias LocaltionLate = Double  
 var myValue : LocaltionLate  
 //assig value  
 myValue=3.141159  
 print(myValue)  

8.cololectio(array)

 var names = ["allent" , "bill" , "candy" ,"eric"]  
 var r=names.count  
 //swift int 會隨32和64位元系統而改變長度  
 println(names[0])  

「swift」筆記1

1.swift不會自動幫你調整語句













以上錯誤的原因在於=和後面的值並沒有空間間隔,正確語法應該如下




















2. var 並不是像JavaScript一樣,指的是一佪不嚴謹的型態,而單純是表示這是一個
變數,有點類似VB6的Dim .

3.swift是採取推論型態(infer type),例如 var str = "abc" ,刖str為String,

若var num = 10 則num為int型態,若 var num2=3.14159則num2為 double

4.明確指定型態

var str:String

str = "test"

5.let com = "gogo"  表示這是一個常數

6.布林值應用

 var isOk:Bool  
 //也可以用1/0  
 isOk = true   
 var compare1=100>200  
 //conditional 控制流程  
 if (compare1)  
 {  
   println("成立")  
 }  
 else  
 {  
   println("不成立")  
 }  

7.元組應用

 var HttpError=(404,"not found")  
 //assignaccess  
 var(errorcode,message)=HttpError  
 print(" 網頁錯誤代碼: \(errorcode) 訊息:\(message)")  

在HttpError中可以有不同的型別以及不限定HttpError內容有多少個資料。

errorcode取值時是依據HttpError變數的順序,

\(errorcode)是用來做parttern print

8.具名元組應用

 var personal2=(id:"001", name:"張三豐" , address:"大陸武當山" , salary:50000)  
 personal2.address="高雄市大甲區"  
 //取出具名配對值  
 println("編號:\(personal2.id) 姓名:\(personal2.name)地址\(personal2.address) 薪資:\(personal2.salary)")  

可以像物件的屬性一樣取值。

9.collection
 var employees=[  
   (id:"001", name:"張三豐" , address:"大陸武當山" , salary:50000),  
   (id:"002", name:"張無際" , address:"大陸武當山" , salary:50000),  
 ]  
 println(employees.count)  
 var e1=employees[1]  
 println("編號:\(e1.id) 姓名:\(e1.name)地址\(e1.address) 薪資:\(e1.salary)")  

可以在collection中宣告多組具名的元組應用,並且像array一樣用index取一整組出來用。

10.將字串轉成Int

 //定義字串  
 var myStr = "123"  
 //轉成Int  
 var r1=myStr.toInt()  

這裡要注意一件事,先看下一面這張圖






















你會發現回傳的Int型別有個問號,swift引入了Optional觀念,在轉型失敗時,會傳回nil,
而不會因為沒有try catch而整個crash。而Optional在做運算時必須Implicit casting
才能使用。

下圖是轉換成Int後,xcode會告訴你這是一個Optional(123)













我們要先對它做隱含轉型,在變數後方加入一個驚嘆號後,它變成123了


























如果轉型失敗則會是nil ,可以先判斷是否為nil不需要用到try catch
 //: Playground - noun: a place where people can play  
 import UIKit  
 //定義字串value type  
 var myStr = "abc"  
 //!表示隱含轉型  
 var r1=myStr.toInt()  
 if (r1 == nil)  
 {  
    println("not Int")  
 }  
 else  
 {  
   println(r1!)  
 }  

2015年7月13日 星期一

「swift」用程式碼加入一個label

在UIViewController.swift輸入以下程式碼

 import UIKit  
 class ViewController: UIViewController {  
   override func viewDidLoad() {  
     super.viewDidLoad()  
     //建立一個UILabel元件  
     var labelTest:UILabel=UILabel()  
     //設定大小及位置  
     labelTest.frame=CGRect(x:60,y:80,width:240,height:40)  
     //設定文字  
     labelTest.text="這是程式碼建立的"  
     //設定文字顏色  
     labelTest.textColor=UIColor.redColor()  
     //把label加入介面  
     view.addSubview(labelTest)  
   }  
   override func didReceiveMemoryWarning() {  
     super.didReceiveMemoryWarning()  
     // Dispose of any resources that can be recreated.  
   }  
 }  


執行結果


「swift」swift是啥

Swift,編譯式編程語言,由蘋果公司在2014年推出,用來撰寫OS XiOS應用程式。

2014年,在AppleWWDC所發布,設計Swift時,蘋果公司有意讓Swift與Objective-C

共存在蘋果公司的作業系統上。


記憶體管理[編輯]
Swift全面使用自動參照計數(ARC)來管理記憶體,取代過去Objective C的垃圾回收功能。

過去在Objective-C中,強參照(strong reference)即為非ARC中的retain,

而弱參照(weak reference)即為非ARC中的assign. 為了解決迴圈參照的問題,

Swift提供unowned, 不能設定為optional types,不能加上問號(?)或驚嘆號(!)。

除錯以及其他元素[編輯]

Xcode的除錯機制針對Swift語言提供REPL(Read-Eval-Print Loop, 

這是源自emacs的術語)環境,可以利用Swift語法來評估或與其他程式互動,

使Swift編程具有類似PythonRuby互動性介面(Interactive Shell)。

類似 Objective-C之處[編輯]

  • 基本數值型別(numeric types)大致相同 (例如Int, UInt, Float, Double)
  • 大量的C 運算元被移出Swift, 但又引入一些新運算元。
  • 大括號被用於群組陳述(group statements)。
  • 變數之賦值使用等於符號, 但比較則使用「連續兩個等於」(==)運算元。還有一個新的運算元,「連續三個等於」(===)被用來判斷常數或變數之間是否為同一物件之實例(instance)。
  • 中括號([], Square brackets)用於陣列的表示, 宣告陣例之後, 可以指派索引值(index)來進行元素(element)之存取。
  • 控制陳述(control statement), for, while, if, switch 與Ojbective-C都十分類似, 但有延伸功能, 像是 for in 用於集合(collection)的輪詢, switch 還可以接受非整數的cases條件值, 諸如此類。

不同於 Objective-C之處[編輯]

  • 陳述句(statement)不須再使用分號 (';')做為結束, 但分號還是可以在一行以內作為兩個以上陳述的分隔。
  • 標頭檔(Header files)不再需要。
  • 註解方式 /* ... */ 可以為巢狀(nested)註解, 意思是指註解內可以再有註解, 過去有些C或C++編譯器不支援巢狀註解。
  • 強型別(strong type)
  • 類型推論或隱含類型(Type inference)
  • 支援泛型編程
  • 函式為第一等類型(first-class object),這意味著函式可以作為其他函式的參數與返回值。
  • 運算元可在類別內重新定義 (運算元重載)。可以生成新的運算元。
  • 字串全方面支援 Unicode。某些字元甚至可以成為語言的名稱。
  • 許多C語言家族過去惡名昭彰的怪語法(error-prone behaviors)也被改變:
    • 不再存在指標
    • 指派(Assignments)不再回傳值。正確寫法是 if (i==0) ,一般容易誤寫成 if (i=0) 會造成編譯時期錯誤(compile-time error)。
    • switch 的區塊內不需要再使用 break 敘述句。另外, case後面都需要有可執行的代碼(C或C++可連續使用多個case而不需要額外的代碼), 否則會發生編譯錯誤。
    • 變數和常數都要被初始化,而且陣列(array)的界限也要確認清楚。
    • 溢位(overflows)的問題。C語言沒有強制整數型別(signed integers)的界限, 常常在執行時間發生問題。Swift可以透過整數型別的max或min屬性取得最大值或最小值。

資料來源: