1. 程式人生 > >Swift學習總結(個人總結,以方便理解為主)

Swift學習總結(個人總結,以方便理解為主)

swift總結

一、註冊cell

1.用nib, 向 tableview 註冊 cell

全域性變數 let cellIdentifier = "myCell"

myTableView!.registerNib(UINib(nibName: "MyCell", bundle:nil), forCellReuseIdentifier: cellIdentifier)

然後在 cellForRowAtIndexPath 方法中使用:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {                   

        var mycell : MyCell = tableView!.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as MyCell

        return mycell

    }

2.用純程式碼,向tableView註冊cell

全域性變數 let cellIdentifier = "myCell"

self.tableView.registerClass(MyCell.classForKeyedArchiver(), forCellReuseIdentifier: cellIdentifier)

然後在 cellForRowAtIndexPath 方法中使用

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! MyCell

        return cell

    }

3.不註冊cell,系統直接建立

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!

{

    let identifier = "CellIdentifier"

    var cell :UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(identifier) as? MyCell

cell = MyCell(style: .Default, reuseIdentifier: identifier)

    var string :String = typeArray[indexPath.row] as String

    cell!.textLabel.text = string

    return cell

}

二、UIViewController 無法服從 UITableViewDataSource 所以最好用UITableViewController

三、懶載入的寫法

//懶載入imageview

    lazy var iconImageView:UIImageView? = {

        var iconImageView = UIImageView(frame: CGRectMake(20, 10, 40, 40))

        self.contentView.addSubview(iconImageView)

        return iconImageView

    }()

不能忘了最後“}”後的小括號

四、巨集定義

OC寫法

#define margin_Left  30

swift寫法

let margin_Left:CGFloat  = 30

需要標示型別,“=”與巨集名必須有至少一個空格,否則會把“=”當作巨集名的一部分

五、用swift迴圈佈局,frame沒法給

let i: Int

for i = 0; i < 2; i++ {

var label1: UILabel = UILabel.init(frame: CGRectMake(margin_Left * i, margin_Top , margin_Label_Width, margin_Label_Height))

        label1.text = "賬號"

        label1.textAlignment = NSTextAlignment.Center

        self.addSubview(label1)

}

其中margin_Left為定義的CGFloat型別的巨集,而i是int型別,swift中無法進行不同型別的數相乘,試了將i強轉成CGFloat型別,仍然實現不了想要的效果,將CGFloat型別強轉成int型別也不行,並且,佈局時也不能用int型別的值

六、定義屬性

OC寫法

@property (nonatomic, strong) UITextField *accountTF;

swift寫法

var accountTF:UITextField? 或 var accountTF:UITextField!

後面加“?”或者加“!”都行,但必須要加,否則會報錯

七、init初始化方法的重寫

override init(frame: CGRect) {

        super.init(frame: frame)

//填寫要重寫的內容

   }

required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

洋紅部分是對init初始化不成功的安全處理,不能少

八、button新增點選事件的寫法

loginButton.addTarget(self, action: "handleLoginButton:", forControlEvents: UIControlEvents.TouchUpInside)

方法名直接以字串的形式寫,執行的時候會自動尋找,這樣一來就沒有任何提醒了,所以一定要正確對應。

九、cocopods的問題

使用cocoapods向swift工程中匯入第三方時,遇到下面的問題

[!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: Alamofire

解決方案:在生成的podfile檔案中,輸入“use_frameworks!”即可

十、protocol協議的寫法

1.自定義協議,及要實現的方法

protocol DetailViewControllerDelegate {

    func myFunc(dic: NSDictionary) //有參無返

    func myFunc1() -> Int //無參有返

    func myFunc2(dic: NSDictionary) -> String //有參有返

}

2.宣告代理

var delegate:DetailViewControllerDelegate!

3.在合適的時機啟動協議,判斷有服從協議,協議方法有實現,就可以呼叫協議

override func viewWillDisappear(animated: Bool) {

        var dic = ["account":"15771095", "password":"123456"]

        if self.delegate != nil {

            self.delegate?.myFunc(dic)

        }

    }

4.在其它的類中服從該協議

class LoginViewController: UIViewController, UITextFieldDelegate, DetailViewControllerDelegate {

}

5.新增自己為代理

var detailVC = DetailViewController()

        detailVC.delegate = self

6.實現協議方法,拿到想要的值

func myFunc(dic: NSDictionary) {

        loginView.accountTF?.text = dic["account"] as? String

        loginView.passwordTF?.text = dic["password"] as? String

    }

十一、block的寫法

在B class類中

1.自定義一個block

typealias callbackfunc=(selectIndex:Int)->Void

2.宣告block

var myFunc = callbackfunc?()

3.傳遞函式

func initBack( mathFunction:(selectIndex:Int)->Void ){

        myFunc = mathFunction

    }

4.回撥

myFunc!(selectIndex: indexPath.row);

在A class類中

5.建立B class的物件,調傳遞函式

xxx.initBack { (selectIndex) -> Void in

//可以做點啥了

   }

注意:在使用協議和block的介面,建立定義協議和block類的物件時,要保證物件的唯一性。可以屬性建立,保證整個類都可以唯一使用,也可以在建立好的時候,直接指定delegate物件,直接呼叫block閉包函式。如果物件不統一,協議和block就不會走,不會起作用的。

十二、服從協議時容易出現的問題

當服從某個協議時,出現以下錯誤,錯誤如下:Type ‘UIViewController’ does not conform to protocol ‘UITableViewDataSource’ 

原因是沒有完全實現UITableViewDataSource裡的所有私有協議方法,當完全實現了所有的私有協議方法後,錯誤就沒有了。

自己建立的protocol協議,方法func前不能新增public和optional,否則報錯,所以建議自定義的協議,需要什麼協議方法就建立,需要多少建立多少,建立預備的協議方法也要記得實現一下。

十三、NSJSONReadingOptions的問題

OC中用NSJSONReadingOptions將NSData轉成id型別

NSError *error;

    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

Swift中同樣有NSJSONReadingOptions將NSData轉成AnyObject型別

NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers)

但是報了這個錯:Call can throw, but it is not marked with ‘try’ and the error is not handled

最後只能搭橋,用OC去解決型別轉換的問題

十四、model的問題

所有的Model還是使用OC來寫,在swift裡面直接寫一直報錯所以就將就用OC寫吧。估計以後會有解決方案,但現在只能藉助於OC。

十五、set get方法的寫法

var _collOrderLabel : UILabel!

var collOrderLabel : UILabel! {

        set (collOrderLabel) {

            _collOrderLabel = collOrderLabel

        }

        get {

            if _collOrderLabel == nil {

                _collOrderLabel = UILabel.init(frame: CGRectMake(10, 35, kWidth - 100, 25))

                _collOrderLabel.font = UIFont.systemFontOfSize(15)

                _collOrderLabel.textColor = UIColor.grayColor()

                self.contentView.addSubview(_collOrderLabel)

            }

            return _collOrderLabel

        }

    }

十六、string轉double,double轉string

string轉double

String型別的字串不能通過.doubleValue轉化成double型別,NSString型別的字串可以通過.doubleValue轉化成double型別。

String型別的字串也沒有length,floatValue,intValue,等等方法,因為這些方法是OC裡的NSString型別的字串才有的方法。

let string = perPriceView.textField.text! as NSString

string.doubleValue 

OK,成功轉化成double型別

double轉string

NSString(format: "%.2f", string.doubleValue) as String

double轉成String型別的字串或者NSString型別的字串都是沒有影響的。

十七、OC中用swift,swift中用OC

swift中用OC

swift中用OC很簡單,建立OC類的時候,選擇自動建立橋接,將OC的標頭檔案匯入到橋接檔案中即可呼叫。

OC中用swift

1、OC中用swift比較複雜,建立swift檔案時,同樣需要選擇自動建立橋接,但不用在橋接檔案中寫任何東西,雖然用不上,但必須還要寫。

2、必須有標頭檔案。而swift檔案卻沒有標頭檔案,所在咱們想必也需要產生一個頭檔案。但對於OC呼叫swift  的標頭檔案比較特殊。因標頭檔案裡面的機制是自動生成的,在不熟悉的,不建議手寫。

那如何產生這個標頭檔案。(注意,系統設定的標頭檔案,在工程中是看不到的。)

產生步驟:

選中targets->build settings ->packing->Product Module Name 中設定模組名,這個名稱很重要 swift 的標頭檔案就是根據這個來命名的。

例如將該名字設定成Text,則需要匯入的標頭檔案為import “Text-swift.h”,但在整個工程中是找不到這個檔案的,但可以使用CMD+滑鼠點選檢視標頭檔案中的內容。