iOS软件开发swiftiOS 开发每天分享优质文章

Swift-知识点

2016-11-05  本文已影响436人  iiNico

协议

协议支持多继承

class SomeClass: SomeSuperClass, FirstProtocol,  AnotherProtocol {
    // 类的内容
   // 实现协议中的方法
}
// 1.定义协议
protocol SportProtocol {
    func playBasketball()
    func playFootball()
}
// 2.遵守协议
// 注意:默认情况下在swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

    // 实现协议中的方法
    func playBasketball() {
        print("人在打篮球")
    }

    func playFootball() {
        print("人在踢足球")
    }
}

协议之间的继承

protocol CrazySportProtocol {
    func jumping()
}

protocol SportProtocol : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}

协议继承用于代理设计模式

protocol BuyTicketProtocol {
    func buyTicket()
}

class Person {
    // 1.定义协议属性
    var delegate : BuyTicketProtocol

    // 2.自定义构造函数
    init (delegate : BuyTicketProtocol) {
        self.delegate = delegate
    }

    // 3.行为
    func goToBeijing() {
        delegate.buyTicket()
    }
}


class HuangNiu: BuyTicketProtocol {
    func buyTicket() {
        print("买了一张火车票")
    }
}

let p = Person(delegate: HuangNiu())
p.goToBeijing()

在Swift中,如果遵守了一个协议,必须要实现,协议里面所有的方法
协议可选是OC的特性

// 1.定义协议
@objc
protocol SportProtocol {
    func playBasketball()

   @objc  optional func playFootball()
}

// 2.遵守协议
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

    // 实现协议中的方法
    @objc func playBasketball() {
        print("人在打篮球")
    }
}

泛型

简单的理解泛型就是一个"泛化"的类型,并不特指某一个具体的类型

闭包

block的用法回顾

* 定义网络请求的类
@interface HttpTool : NSObject
- (void)loadRequest:(void (^)())callBackBlock;
@end

@implementation HttpTool
- (void)loadRequest:(void (^)())callBackBlock
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"加载网络数据:%@", [NSThread currentThread]);

        dispatch_async(dispatch_get_main_queue(), ^{
            callBackBlock();
        });
    });
}
@end


* 进行网络请求,请求到数据后利用block进行回调
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self.httpTool loadRequest:^{
        NSLog(@"主线程中,将数据回调.%@", [NSThread currentThread]);
    }];
}

闭包格式

类型    类型:(形参列表)->(返回值)
        {
值          (形参) -> 返回值类型 in
            执行代码
        }

使用闭包代替block

* 定义网络请求的类

class HttpTool: NSObject {

    func loadRequest(callBack : ()->()){
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("加载数据", [NSThread.currentThread()])

             dispatch_async(dispatch_get_main_queue(), { () -> Void in
                callBack()
             })
        }
    }
}


* 进行网络请求,请求到数据后利用闭包进行回调

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 网络请求
        httpTool.loadRequest ({ () -> () in
            print("回到主线程", NSThread.currentThread());
        })
    }

闭包的简写
如果闭包没有参数 in和in之间的内容可以省略

    httpTool.loadRequest({
        print("回到主线程", NSThread.currentThread());
    })

尾随闭包

    httpTool.loadRequest() {
        print("回到主线程", NSThread.currentThread());
    }


    // 开发中建议该写法
    httpTool.loadRequest {
        print("回到主线程", NSThread.currentThread());
    }

如果在HttpTool中有对闭包进行强引用,则会形成循环引用

class HttpTool: NSObject {

    // 定义属性,来强引用传入的闭包
    var callBack : (()->())?

    func loadRequest(callBack : ()->()){
        dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
            print("加载数据", [NSThread.currentThread()])

             dispatch_async(dispatch_get_main_queue(), { () -> Void in
                callBack()
             })
        }

        self.callBack = callBack
    }
}
在Swift中检测一个对象是否销毁,可以实现对象的deinit函数

循环引用解决方案

懒加载

    // 懒加载的本质是,在第一次使用的时候执行闭包,将闭包的返回值赋值给属性
    // lazy的作用是只会赋值一次
    lazy var array : [String] = {
        () -> [String] in
        return ["sz", "lmj", "lnj"]
    }()

注释

开启分组注释
因为默认的话 TODO 跟 FIXME 是没有开启的,所以需要我们手动开启
步骤 一


步骤二


开启注释代码 直接复制粘贴就好了

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \\( -name "*.swift" \\) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\\$" | perl -p -e "s/($TAGS)/ warning: \\$1/"

优点:

访问权限

OC中的访问权限

@private:作用范围只能在自身类
@protected:作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。
@public:作用范围最大,在任何地方
@package:本包内使用,跨包不可以

Swift中的访问控制模型基于模块和源文件,类这三个概念

internal:在本模块中都可以进行访问 默认的 子类可以继承
private:当前类私有
fileprivate:在当前源文件中可以访问
public:在其他模块中可以访问,但不能被override,如果修饰类,则无法继承
open:在其他模块中可以访问,并且可以被override,如果修饰类,可以继承

方法抛出异常

Swift调用OC

方式一 创建OC文件时提示,点击Create Bridging Header

方式二

导入桥接文件的全路径

在桥接文件中,直接导入OC的头文件,就可以使用了

OC调用Swift

上一篇 下一篇

猜你喜欢

热点阅读