.self swift_swift4.2 self.performselector - CSDN
  • Swift Self关键字的用法

    相信大家都知道self关键字的作用, 但你知道Swift还有个Self关键字吗?
    Self关键字只能用在类里, 作为函数返回值类型, 表示当前类。


    类定义.png


    这段代码里有self和Self, self指向类自身;Self只能作为函数关键字, setValue函数的返回值是ClassA类型。
    我们看到有个warning, 就是setValue函数的返回值没有被使用; 这时可以用注解@discardableResult解决。


    注解.png

    PS: Self关键字常常和@discardableResult配对使用。

    var objA: ClassA? = ClassA(a: 1, b: 2)
    var objB = objA?.setValueA(param: 3)
    print("objA a: (objB!.a)")
    objB = nil
    objA = nil
    Swift的类是引用传递, 上面的objA和objB指向同一个对象, 即引用计数为2, 将2者都设置为nil后立即执行析构函数deinit。
    日志:
    objA a: 3
    ClassA deinit

    参考上面类的写法,编写一个结构体,但结构体不支持Self关键字! 

    struct StructA {
    var a: Int
    var b: Int
    init(a: Int, b: Int) {
    self.a = a
    self.b = b
    }
    @discardableResult
    mutating func setValueA(param: Int) -> StructA {
    self.a = param
    return self
    }
    }
    var structA = StructA(a: 1, b: 2)
    var structB = structA.setValueA(param: 3)
    print("structA a: (structA.a), structB a: (structB.a)")
    structB.a = 4
    print("after set 4, structA a: (structA.a), structB a: (structB.a)")
    结构体是值传递, setValueA会新生成一个相同的实例。
    日志:
    structA a: 3, structB a: 3
    after set 4, structA a: 3, structB a: 4

    声明一个枚举说明值传递。

     enum EnumA: Int {
    case Monday
    case Tuesday
    }
    extension EnumA {
    func getEnum(a: Int) -> EnumA {
    switch a {
    case 1:
    return .Monday
    case 2:
    return .Tuesday
    default:
    return self
    }
    }
    }
    var enumA: EnumA = .Tuesday
    var enumB = enumA.getEnum(a: 0)
    print("enumA: (enumA.rawValue), enumB:(enumB.rawValue)")
    enumB = .Monday
    print("after set monday, enumA: (enumA.rawValue), enumB:(enumB.rawValue)")

    输出:
    enumA: 1, enumB:1
    after set monday, enumA: 1, enumB:0

    展开全文
  • swift中的self属性

    2017-03-09 13:45:47
    Every instance of a type has an implicit property called self, which is exactly equivalent to the instance itself. You use the self property to refer to the current instance within its own instance ...

    这里写图片描述
    Every instance of a type has an implicit property called self, which is exactly equivalent to the instance itself. You use the self property to refer to the current instance within its own instance methods.
    每个类型的实例都有一个隐式的属性self,它实际上相当于实例它自己。以应用self属性在它的实例方法中引用当前的实例。
    注意:是在实例方法中引用它自己。
    因此上边的方法也可以这样写:
    这里写图片描述
    In practice, you don’t need to write self in your code very often. If you don’t explicitly write self, Swift assumes that you are referring to a property or method of the current instance whenever you use a known property or method name within a method. This assumption is demonstrated by the use of count (rather than self.count) inside the three instance methods for Counter.
    实际上,你并不需要经常在你的代码中写self。如果你不显示的写self,swift假定你正在引用的是当前实例的属性或者方法,无论你什么时候应用已知的属性或者方法。
    The main exception to this rule occurs when a parameter name for an instance method has the same name as a property of that instance. In this situation, the parameter name takes precedence, and it becomes necessary to refer to the property in a more qualified way. You use the self property to distinguish between the parameter name and the property name.
    设置self属性的主要目的是为了当方法中的参数和实例的属性有相同名字时使用。在这种情况下,参数优先,用一种更加合理的方式来引用属性时非常必要的。你应用self来区分参数名和属性名。
    这里写图片描述

    展开全文
  • swift - 类型中的self

    2016-04-27 15:27:54
    swift中,关键字表示类型本身 。 (self) 意义 : 消除局部和类型全局的歧义。 class Counter{ var count = 0  func increment(){  self.count++ } }

    swift中,关键字表示类型本身 。 (self

    意义 : 消除局部和类型全局的歧义。


    class Counter{

    var count = 0 

    func increment(){

     self.count++

    }

    }

    展开全文
  • Swift中能够表示 “任意” 这个概念的除了 Any 和 AnyObject 以外,还有一个AnyClass。我们能够使用AnyClass协议作为任意类型实例的具体类型。AnyClass在Swift中被所定义: typealias AnyClass = AnyObject....
    在Swift中能够表示 “任意” 这个概念的除了 Any 和 AnyObject 以外,还有一个AnyClass。我们能够使用AnyClass协议作为任意类型实例的具体类型。AnyClass在Swift中被所定义:

    typealias AnyClass = AnyObject.Type
    通过AnyObject.Type这种方式所得到是一个元类型 (Meta)。在声明时我们总是在类型的名称后面加上.type,比如:Person.type代表的是A这个类型的类型。也就是说,我们可以声明一个元类型来存储Person这个类型本身,而在从Person中取出其类型时,我们需要使用到.self:

    class Person {
        
    }
    let type: AnyClass = Person.self //Person.Type

    注意:其实在 Swift中,.self可以用在类型后面取得类型本身,也可以用在某个实例后面取得这个实例本身。前一种方法可以用来获得一个表示该类型的值,这在某些时候会很有用; 而后者因为拿到的实例本身,所以暂时似乎没有太多需要这么使用的案例。

    如果Person中有一个类方法时,我们就可以通过type来对其进行调用了:

    class Person {
        class func age() -> Int {
            return 24
        }
    }
    let type: AnyClass = Person.self
    
    //1:
    (type as! Person.Type).age()
    
    //2:
    let type2: Person.Type = Person.self
    type2.age()

    AnyClass的使用场景


    元类型可以变得非常灵活和强大,而且在我们编写某些框架性的代码时会非常方便。比如我们想要传递一些类型的时候,我们可以使用AnyClass进行处理,那么就不需要不断地去改动代码了。下面的这个例子中虽然我们是用代码声明的方式获取了SearchViewController和MessageViewController的元类型,但是其实这一步骤完全可以通过读入配 置文件之类的方式来完成的。而在将这些元类型存入数组并且传递给别的方法来进行配置这一点上,元类型编程就非常棒而且很难被替代:

    class SearchViewController: UIViewController {
        
    }
    class MessageViewController: UIViewController {
        
    }
    
    let vcTypes: [AnyClass] = [SearchViewController.self,
                               MessageViewController.self]
    
    func setupViewControllers(_ vcTypes: [AnyClass]) {
        for vcType in vcTypes {
            if vcType is UIViewController.Type {
                let vc = (vcType as! UIViewController.Type).init()
                print(vc)
            }
        }
    }
    
    setupViewControllers(vcTypes)
    /*
     <__lldb_expr_160.SearchViewController: 0x7ff265703060>
     <__lldb_expr_160.MessageViewController: 0x7ff265602c10>
     */
    

    这么一来,我们完全可以搭好框架,可以在不触及Swift编码的情况下,很简单地完成一系列复杂操作了。

    另外,在 Cocoa API中我们经常遇到需要输入一个AnyClass,我们应该使用.self的方式来获取对应的类型。如注册tableView的可重用cell时:

     tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")

    注意:.Type 表示的是某个类型的元类型,而在Swift中,除了class,struct和enum这三个类型外,我们还可以定义protocol。对于protocol来说,有时候我们也会想取得协议的元类型。这时我们可以在某个protocol的名字后面使用.Protocol 来获取,使用的方法和 .Type是类似的。




    展开全文
  • 类(OC),只好自己研究下了,写了一个获取类名的扩展名,后来发现有个.self的方法,也尝试了下哈,看下图 print(UIScreenEdgePanGestureRecognizer().ClassName) print(UIScreenEdgePanGestureRecognizer.self) ...
  • R.swift可以很方便的管理IOS各种资源, 有点类似Android中的R类…. 先来看看效果图: 库的首页: https://github.com/mac-cain13/R.swift安装方法: http://www.jianshu.com/p/0c97ef3cdc38 安装需要2点: 1:需要...
  • SQLite.swift的简单使用

    2019-06-25 17:36:09
    pod ‘SQLite.swift’ // // SQLiteTool.swift // CreateLectureForSwift // // Created by coder on 2019/6/25. // Copyright © 2019 AlexanderYeah. All rights reserved. // import Foundatio...
  • R.swiftSwift 更方便快捷安全的使用资源文件, 一旦学会使用, 我保证你会爱上它R.swift GitHub 地址R.swift 特点: 每当项目build时,R.swift开始运行 这个文件根据项目里的资源文件自动在 R.generated.swift 文件...
  • class UIViewSpringAnimator: SwipeAnimator {    // 动画完成的闭包  var completion:((Bool) -> Void)?    func addCompletion(completion: @escaping (Bool) -> Void) {
  • 需求在Swift中字符串的相关操作再也不是Int类型,而是String.Index。虽然不知道官方为什么这样设计,但是在开发的时候,使用起来,确实是不好看,而且让代码看起来不简洁。因此,为了方便以后的使用,就简单的封装...
  • swift中的!和?作用

    2017-09-28 16:03:23
    在实际用Swift写CocoaTouch时,发现下面这样写才可以通过编译 var amiteLbl :UILabel? self.amiteLbl = UILabel(frame:CGRectMake(50,100,200,40)) self.amiteLbl!.text = "I love mixbox" self.view?....
  • 对菜鸟自己的总结 self.tabBarItem.image设置的image是对应标签栏单个按钮的image图片 ...self.tabBar insertSubview: atIndex: 如果self本身是tabbarcontroller,它便设置的是整个标签栏的背景图
  • 1.self.edgesForExtendedLayout = UIRectEdgeNone;属性edgesForExtendedLayout,意思大概是边缘向四周展开edgesForExtendedLayout 值是结构体,默认值是 UIRectEdgeAll,也就是说,当一个控制器要往父控制器添加的...
  • swift - self的弱引用

    2019-06-21 10:21:53
    1. weak var weakSelf = self   2. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {[weak self] in self?.v.showAppLoadView(deadTime: deadTime, co...
  • 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了。更有甚者连IMP, objc_msgSend也不能用了。虽然想不通为什么,但应该有他的道理。就不纠结了。 大家可能在OC中使用得更多的就是延时处理...
  • class WangMuMu {var name: String /*2.*/ /* 即使按照 1 里面写的来做依然是不行的 ... 这是因为Swift必须保证当前类和子类都能相应init这个方法 */required init() { name = "qq"}//构建一个Self类型对象
  • self.title=@"haha";这个方法 首先找给self.navigationItem.title赋值 再给self.TabBarItem.title赋值 一般非根控制器才使用self.title,因为根控制器有顶部和底部导航条,一不小心就会全部设置上
  • 在Objective-C中,如果要获取一个类的类型,可以使用 Student.class,获取对象的类型使用 student.class。但在Swift中使用下面的方式进行替代 也就是student.dynamicType和Student.self
  • swift 设置navigationBar titleTextAttributes  //设置navigationBar的背景图片 let backgroundImage = UIImage(named: "navigation_bg") self.navigationBar.setBackgroundImage(backgroundImage, forBarM
  • OC 调用 Swift 方法

    2018-09-06 11:47:34
    1.新建Swift文件之前做以下设置 2.创建Swift文件后,会提示创建桥接文件,点击创建 3.Swift 类 import Foundation class RealmManager: NSObject { override init() { super.init() } @objc func ...
1 2 3 4 5 ... 20
收藏数 40,153
精华内容 16,061
关键字:

.self swift