这些问题及回答,都归纳至泊学用户群,是大家在平日的学习工作过程中遇到的各种小问题,以及解答!将会持续更新
Q:
请教一下这句话的意思?
我现在
做了两个页面的跳转 但是代码过去了 界面没过去
哦原来是时间问题 不能在viewDidLoad 里面直接跳转页面。。 swift 还有什么事件 可以知道页面加载完成啊 ?
A:
切换UI总要有个什么外部事件吧,例如资源加载完成?用户选择了跳过?或者是什么其他的
总不能VC加载完了就立刻切
Q:swift 如何怎么打印变量地址 什么符号
A:在Swift 3里,这样
Q:为什么singleton 能这么写 static let shareInstance = XXX()
我自己 理解是 shareInstance 用static修饰 是一个类分配一块空间
像Class这种 是不是 用Static修饰 就是在里面 开设一块永久空间 存在 属性 和方法?
A:
这里没有所谓里面、外面的说法,static属性不是类对象的一部分。他就是一个在内存里独立存在的对象。
Q:我加上static 和不加static 属性 a 的内存地址 都是一个
按你说的 a 加上static 修饰 应该 存放在static 单独的那块内存中
A:
static属性不是类对象的一部分
就从你刚才的例子其实也能看出来了,a和b的地址也不连续
Q:
extension Rational: Equatable {} func == (lhs: Rational, rhs: Rational) -> Bool {
为什么==的实现要写在extension外面呢?
求教~。。。
A:
其实,重载运算符定义在Global,而不定义为method,这是一个编程语言设计中的惯用形式。为什么是这样呢?在C++里,当我们把 == 重载在类方法内部时,就会强制 == 的左操作数一定是类对象,而不是和这个类对象“等价”的某种形式的其他值。但这样是违背相等操作语义的。因此,为了让 值 == 对象 和 对象 == 值 都可以生效。诸如 赋值、比较这样的二元操作符重载,都定义成Global function。这样,编译器就可以处理上述交换的问题了。
Q:
有个疑问,关于protocol中函数不能包含默认值,对下面这句话不太理解:“当protocol中的方法带有参数时,参数是不能有默认值的。如果我们希望把“提供有默认参数版本的方法”也作为一种约定,我们只能像下面这样单独定义一个不带任何参数的方法。例如我们要添加一个生成引擎名称的方法”
A:
然后,实现的时候,让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 是否可以作为 某种具体的类型
就类似这样的用法
总之 as 更多的含义就是单词 as,转型的意味不重
Q:
請教有可能從uiimage 判讀原本圖片的格式是png 或jpg嗎? 轉回nsdata 再判斷頭一個byte 在swift貌似無用
A:
UIImageJPEGRepresentation / UIImagePNGRepresentation 可以判断
Q:
求教 IOS里面 用ALAMOFire 上传 我需要把线程卡住吗? 还是说它直接后台上传了不用管了。 按了HOME都没问题?
A:
...回去到上传的请求了随意操作啊,为什么要卡线程
Q:
如果是很大的文件怎么半 要是不成功 用户也不知道。 原来都是写BS架构的。 这种情况要怎么处理啊?
A:
- 如果你要处理很大的文件上传,你的App至少要有一个专门的UI来处理吧?否则你不仅你不知道,用户岂不是也很蒙圈~
- 多线程和返回Home之后仍旧可以上传是两回事;
- 如果想系统后台上传,注册是一个backgroundSession就行了。然后在handleEventsForBackgroundURLSession里,处理事件;
Q:
主要是 如果用户使用Home建 然后在内存里面关掉了APP这种操作 要怎么处理?
这种情况有事件出来吗? 还是说要自己下次启动的时候验证是否成功?
A:
这种操作木有处理,系统也不会通知
你这个问题涉及到复杂的线程控制
当耗时很久的线程启动后,你需要有一种机制能让它提前终止
Q:
那就是说 要自己验证问题了。 本地要写进度记录。 不知道alamofire 能不能断点续传? 不行就重新上传吧。。
A:
代码可能是这样的。
ui,开始下载:thread.start() ui,终止下载:thread.stop() 线程的代码: function stop() { terminated = true } 线程的工作函数: function working() { while (!terminated) { ....... } }
Q:
求教 将函数 作为参数 要怎么写啊 这个函数有参数的
我这样写报错
A:
先想明白到底想咋样
- 按照你第一个图的结果,你需要的参数分明是一个值,不是一个函数;
- 按照你第二个图的结果,你需要传递一个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:
- Tuple不再可以传给接受和Tuple元素同样的函数作为参数;
- 接受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 是否可以作为 某种具体的类型
总之 as 更多的含义就是单词 as,转型的意味不重
Q:
swift能捕获 exception么,不是error type
A:
Swift里的异常就是任何实现了ErrorProtocol的类型