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+鼠标点击查看头文件中的内容。

你可能感兴趣的:(iOS)