美文网首页iOS Developer
关于Swift学习及开发中会遇到的小问题集锦(1)

关于Swift学习及开发中会遇到的小问题集锦(1)

作者: ma10 | 来源:发表于2016-11-29 11:21 被阅读78次

    这些问题及回答,都归纳至泊学用户群,是大家在平日的学习工作过程中遇到的各种小问题,以及解答!将会持续更新


    Q:
    请教一下这句话的意思?

    Paste_Image.png

    我现在

    Paste_Image.png

    做了两个页面的跳转 但是代码过去了 界面没过去
    哦原来是时间问题 不能在viewDidLoad 里面直接跳转页面。。 swift 还有什么事件 可以知道页面加载完成啊 ?
    A:
    切换UI总要有个什么外部事件吧,例如资源加载完成?用户选择了跳过?或者是什么其他的
    总不能VC加载完了就立刻切


    Q:swift 如何怎么打印变量地址 什么符号
    A:在Swift 3里,这样

    Paste_Image.png

    Q:为什么singleton 能这么写 static let shareInstance = XXX()
    我自己 理解是 shareInstance 用static修饰 是一个类分配一块空间
    像Class这种 是不是 用Static修饰 就是在里面 开设一块永久空间 存在 属性 和方法?
    A:
    这里没有所谓里面、外面的说法,static属性不是类对象的一部分。他就是一个在内存里独立存在的对象。


    Q:我加上static 和不加static 属性 a 的内存地址 都是一个
    按你说的 a 加上static 修饰 应该 存放在static 单独的那块内存中

    Paste_Image.png

    A:

    Paste_Image.png

    static属性不是类对象的一部分
    就从你刚才的例子其实也能看出来了,a和b的地址也不连续


    Q:
    extension Rational: Equatable {} func == (lhs: Rational, rhs: Rational) -> Bool {
    为什么==的实现要写在extension外面呢?
    求教~。。。
    A:
    其实,重载运算符定义在Global,而不定义为method,这是一个编程语言设计中的惯用形式。为什么是这样呢?在C++里,当我们把 == 重载在类方法内部时,就会强制 == 的左操作数一定是类对象,而不是和这个类对象“等价”的某种形式的其他值。但这样是违背相等操作语义的。因此,为了让 值 == 对象 和 对象 == 值 都可以生效。诸如 赋值、比较这样的二元操作符重载,都定义成Global function。这样,编译器就可以处理上述交换的问题了。


    Q:
    有个疑问,关于protocol中函数不能包含默认值,对下面这句话不太理解:“当protocol中的方法带有参数时,参数是不能有默认值的。如果我们希望把“提供有默认参数版本的方法”也作为一种约定,我们只能像下面这样单独定义一个不带任何参数的方法。例如我们要添加一个生成引擎名称的方法”

    Paste_Image.png

    A:

    Paste_Image.png

    然后,实现的时候,让f1的实现用一个期望的默认值。。。。
    这样,f1 看上去就跟可以有一个默认参数一样
    如果要把提供默认值变成一种强制行为,就那样定义在protocol里
    否则,实现的时候自己整也行


    Q:
    ?强制行为?实现A的时候f1也可以不设置默认参数啊,如何实现强制呢?
    A:
    这个有点儿trick.....如果你像上面那样定义了protocol,在实现它的时候,就必须要定义两个版本的 f1,一个带参数;一个不带任何参数
    而你在实现的时候,让带参数的版本有默认值是不行的
    所以,没啥特别的需要,可以不用这么干,直接在实现的时候,让参数有默认值就好了


    Q:
    用as 做casting得到一定是個optional?
    意思是 as 和 as? 是同樣意思嗎?

    A:
    准确的讲,type casting是没法用 as 的
    要不用as? optional转,要不 as! force cast
    as 可以用在case语句里,例如 case str as String 这样,判断某个Any 或 AnyObject 是否可以作为 某种具体的类型

    Paste_Image.png

    就类似这样的用法
    总之 as 更多的含义就是单词 as,转型的意味不重


    Q:
    請教有可能從uiimage 判讀原本圖片的格式是png 或jpg嗎? 轉回nsdata 再判斷頭一個byte 在swift貌似無用

    A:
    UIImageJPEGRepresentation / UIImagePNGRepresentation 可以判断


    Q:
    求教 IOS里面 用ALAMOFire 上传 我需要把线程卡住吗? 还是说它直接后台上传了不用管了。 按了HOME都没问题?
    A:
    ...回去到上传的请求了随意操作啊,为什么要卡线程


    Q:
    如果是很大的文件怎么半 要是不成功 用户也不知道。 原来都是写BS架构的。 这种情况要怎么处理啊?
    A:

    1. 如果你要处理很大的文件上传,你的App至少要有一个专门的UI来处理吧?否则你不仅你不知道,用户岂不是也很蒙圈~
    2. 多线程和返回Home之后仍旧可以上传是两回事;
    3. 如果想系统后台上传,注册是一个backgroundSession就行了。然后在handleEventsForBackgroundURLSession里,处理事件;

    Q:
    主要是 如果用户使用Home建 然后在内存里面关掉了APP这种操作 要怎么处理?
    这种情况有事件出来吗? 还是说要自己下次启动的时候验证是否成功?
    A:
    这种操作木有处理,系统也不会通知
    你这个问题涉及到复杂的线程控制
    当耗时很久的线程启动后,你需要有一种机制能让它提前终止


    Q:
    那就是说 要自己验证问题了。 本地要写进度记录。 不知道alamofire 能不能断点续传? 不行就重新上传吧。。
    A:
    代码可能是这样的。
    ui,开始下载:thread.start() ui,终止下载:thread.stop() 线程的代码: function stop() { terminated = true } 线程的工作函数: function working() { while (!terminated) { ....... } }


    Q:
    求教 将函数 作为参数 要怎么写啊 这个函数有参数的

    Paste_Image.png

    我这样写报错

    Paste_Image.png

    A:
    先想明白到底想咋样

    1. 按照你第一个图的结果,你需要的参数分明是一个值,不是一个函数;
    2. 按照你第二个图的结果,你需要传递一个Closure,而不是一个真实的函数调用;
      如果参数是个Closure,说明你需要的是实现过程;如果参数是个值,说明你需要的是结果;
      在函数参数的地方声明个Clousre,在函数调用的时候,传递结果。。。
      这就很尴尬了
      不用在里面写参数类型 直接是把函数名当参数就行

    Q:
    有人知道為何appencontentof 吃一個string array 的variable 會報錯嗎?
    A:
    因为调用contentOf的时候有一个要求,就是参数序列中的元素类型,必须和原数组中元素类型一样,但是String和AnyObject不一样,所以把一个Array<String>变量传递给Array<AnyObject>应该是不行的。至于字面值为什么可以。我觉得是当那个字面值用在函数参数那个位置做type inference的时候,自动推导成Array<AnyObject>了,因为只有这样编译才能通过
    但是你在定义oo的时候,显然不会推导成Array<AnyObject>


    Q:
    另外這中我發現一個問題有點弄不清楚,String是一個struct吧?一個 struct array顯然不是AnyObject compatible,但為何[String] 是一個 AnyObject ?
    A:
    因为当String要转换成一个AnyObject的时候,在数组中存放的时候,这个行为是bridge到OC runtime完成的
    本质上就是一个 NSArray 里面存了 NSString
    处理完,再从OC runtime里,COPY到Swift
    我是这么理解的。。。。


    Q:
    這樣bridge效率會差一點嗎?
    A:
    会的。


    Q:
    swift 里面有类似pch的功能吗?
    A:
    Swift里,就不需要pch...
    swift是分模块的,模块内不需要import,模块间才需要。整个app是一个模块。


    Q:
    3.0元组有变化么
    A:

    1. Tuple不再可以传给接受和Tuple元素同样的函数作为参数;
    2. 接受Tuple参数、接受和Tuple元素类型相同参数的函数,将被明确识别为两个独立的函数类型。

    Q:
    用as 做casting得到一定是個optional?
    意思是 as 和 as? 是同樣意思嗎?
    A:
    准确的讲,type casting是没法用 as 的
    要不用as? optional转,要不 as! force cast
    as 可以用在case语句里,例如 case str as String 这样,判断某个Any 或 AnyObject 是否可以作为 某种具体的类型

    Paste_Image.png

    总之 as 更多的含义就是单词 as,转型的意味不重


    Q:
    swift能捕获 exception么,不是error type
    A:
    Swift里的异常就是任何实现了ErrorProtocol的类型

    相关文章

      网友评论

        本文标题:关于Swift学习及开发中会遇到的小问题集锦(1)

        本文链接:https://www.haomeiwen.com/subject/zyuapttx.html