V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hard2reg
V2EX  ›  问与答

Swift 中如何实例化一个类

  •  
  •   hard2reg · 2019-09-24 01:20:14 +08:00 · 1687 次点击
    这是一个创建于 1666 天前的主题,其中的信息可能已经有所发展或是发生改变。
    	
        var audioRecorder:AVAudioRecorder!
        var audioPlayer:AVAudioPlayer!
        
        let audioSession = AVAudioSession.sharedInstance()
    
    

    这段代码中 AVAudioRecorder AVAudioPlayer AVAduioSeesion 都是类吧,前两行是实例化吗?如果不是为什么不写成 audioRecorder = AVAudioRecorder() ?最后为什么要加感叹号呢?难道 audioRecorder 还有可能为 nil ?

    14 条回复    2019-09-24 11:00:44 +08:00
    luxy
        1
    luxy  
       2019-09-24 01:32:04 +08:00 via iPhone
    前两行是变量声明,!表明是 Optional 可选类型
    hard2reg
        2
    hard2reg  
    OP
       2019-09-24 01:43:45 +08:00
    @luxy 相当于声明两个指针吗?
    hard2reg
        3
    hard2reg  
    OP
       2019-09-24 01:47:01 +08:00
    @luxy 官方文档中说 AVAudioRecorder 是一个类,使用一个类不是应该实例化吗,为什么是声明?
    kingcos
        4
    kingcos  
       2019-09-24 02:04:49 +08:00 via iPhone
    @hard2reg 因为你没有初始化,所以只是声明,初始化,或者说实例化,你要调用构造方法,不然怎么分配内存空间,初始化变量什么的呢?
    kingcos
        5
    kingcos  
       2019-09-24 02:07:38 +08:00 via iPhone   ❤️ 1
    感叹号这里意思是,由你保证这两个变量是非空的,如果在某一阶段被赋值了 nil,那下次你在用他的时候就直接崩了
    AwayEM
        6
    AwayEM  
       2019-09-24 02:09:08 +08:00 via iPhone
    学啥子不好学 swift
    luxy
        7
    luxy  
       2019-09-24 02:30:28 +08:00 via iPhone   ❤️ 1
    @hard2reg 代码中找找,在使用前应该有实例化的。这里只是声明,可以在使用的时候再实例化。
    hard2reg
        8
    hard2reg  
    OP
       2019-09-24 02:37:18 +08:00
    @kingcos 那为啥不直接初始化了呢,非要 var。

    我在网上看到其他类似的代码,但最后是问号,这样是不是就没有感叹号来的严谨?
    NUKZ
        9
    NUKZ  
       2019-09-24 09:16:20 +08:00 via iPhone   ❤️ 1
    前两行声明,可以理解为:你买个一个房子,房本(合同)上写着你的名字,但是开发商还没有盖好。等盖好了(初始化完成),你住进去,房子的才真实的存在,你可以使用他的属性,如:睡觉,做饭,看电视。至于为什么要分!,?。你可以这么理解:感叹号表示你只有一套房子,如果你把它卖了(置为 nil ),你就没有地方睡觉了。问号表示你有好几套房子,这套房子卖了,你还在其他房子可以住。新手这么理解,真正含义,等你多撸撸代码就懂了。回答不好,请各位老哥轻点喷。
    sSsSsSs
        10
    sSsSsSs  
       2019-09-24 09:16:47 +08:00
    @hard2reg 先声明变量然后给变量赋值,或者在声明的同时赋值。两种不同写法而已,干嘛这么纠结呢。至于!前面的人都讲了
    CommandZi
        11
    CommandZi  
       2019-09-24 09:39:00 +08:00
    一般不会在声明的时候加感叹号,你搜一些新一点的代码看吧,你贴的这个编写的人显然对 Swift 中 Optional 类型不是很了解
    lllllliu
        12
    lllllliu  
       2019-09-24 09:47:59 +08:00   ❤️ 1
    var audioRecorder:AVAudioRecorder!
    var audioPlayer:AVAudioPlayer!

    前面这两行 冒号后面的是类型,加!相当于隐式的让比这两个变量在以后操作的时候都默认不是 nil,一旦没有赋值就直接报错。因为在做 audio 相关的时候这两个变量必须存在,也是省下了下文进行操作的时候再加!的操作而已呀。
    let audioSession = AVAudioSession.sharedInstance() 这个就是获取音频会话的单利。
    lllllliu
        13
    lllllliu  
       2019-09-24 09:51:35 +08:00
    还有就是强制解析的事,用!可以直接用。
    0x11901
        14
    0x11901  
       2019-09-24 11:00:44 +08:00
    很多年前大家还在写 c 的时候,喜欢把函数中用到的所有的变量在函数开始的时候先声明一下。后来这种做法渐渐被遗弃了,不过还是有人会这么写吧……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3611 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:04 · PVG 19:04 · LAX 04:04 · JFK 07:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.