Swift面试题,看这些就够了

更新时间:2023-06-24 09:58:15 阅读: 评论:0

Swift⾯试题,看这些就够了
最近看到⼀篇写swift⾯试题的⽂章,写的⾮常好,特此翻译过来供⼤家查阅,每个问题都会提供答案。
书⾯问题
初学者
Question #1
请⽤更好的⽅式写这个for循环:
for var i =0; i < 5; i++{
print("Hello!")
十个字的好句
}
Answer:
名字大全游戏for _ 4 {
print("Hello!")
}
Swift实现了两个范围操作符,闭合操作符和半开操作符。 第⼀个包括范围中的所有值。 例如,以下包括从0到4的所有整数:
0 (4)
半开操作符不包括最后⼀个元素。 以下产⽣相同的0到4结果:
0 .. <5
Question #2
公建项目考虑下⾯的代码:
struct Tutorial {
var difficulty:Int=1
}
var tutorial1 = Tutorial()
var tutorial2 = tutorial1
tutorial2.difficulty =2
tutorial1.difficulty和tutorial2.difficulty的值是什么?如果Tutorial是⼀个类,这将是什么不同?为什么?
Answer:
tutorial1.difficulty是1,⽽tutorial2.difficulty是2。
Swift中的结构是值类型,它们通过值⽽不是引⽤来复制。以下⾏创建tutorial1的copy并将其分配给tutorial2:
形容鲜花的词语var tutorial2 = tutorial1
从这⼀⾏开始,对tutorial2的任何更改都不会反映在tutorial1中。
如果Tutorial是⼀个类,tutorial1.difficulty和tutorial2.difficulty将是2.在Swift中的类是引⽤类型。对tutorial1的属性的任何更改都将反映到tutorial2中,反
如果Tutorial是⼀个类,tutorial1.difficulty和tutorial2.difficulty将是2.在Swift中的类是引⽤类型。对tutorial1的属性的任何更改都将反映到tutorial2中,反
Question #3
view1⽤var声明,view2⽤let声明。这⾥有什么区别,最后⼀⾏会编译?
import UIKit
var view1 =UIView()
view1.alpha =0.5
let view2 =UIView()
view2.alpha =0.5// Will this line compile?
Answer:
view1是⼀个变量,可以重新分配给⼀个新的UIView实例。通过让你只能赋值⼀次,所以下⾯的代码不编译:
view2 = view1 // Error: view2 is immutable
但是,UIView是⼀个具有引⽤语义的类,所以你可以改变view2的属性(这意味着最后⼀⾏将编译):
let view2 =UIView()
view2.alpha =0.5// Yes!
Question #4
此代码按字母顺序对名称数组进⾏排序,看起来很复杂。尽可能简化它和关闭。let animals =["fish", "cat", "chicken", "dog"]
let sortedAnimals = animals.sort{(one:String, two:String)-> Bool in return one < two
}
Answer:
第⼀个简化与参数有关。类型推理系统可以计算闭包中的参数的类型,所以你可以摆脱它们:
let sortedAnimals = animals.sort{(one, two)-> Bool in return one < two }
散播爱的小天使
返回类型也可以推断,所以放弃它:
let sortedAnimals = animals.sort{(one, two)in return one < two }
$ i表⽰法可以替换参数名称:
let sortedAnimals = animals.sort{return $0 < $1}
放羊的故事在单语句闭包中,可以省略return关键字。最后⼀条语句的返回值成为闭包的返回值:
let sortedAnimals = animals.sort{ $0 < $1}
这已经更简单,但现在不要停⽌!
对于字符串,有⼀个⽐较函数定义如下:
中国童话func <(lhs:String, rhs:String)-> Bool
这个整洁的⼩函数使你的代码像下⾯这样容易:
let sortedAnimals = animals.sort(<)
请注意,此渐进的每个步骤都会编译并输出相同的结果,并且您创建了⼀个字符闭包!
Question #5
此代码创建两个类,Address和Person,它创建两个实例来表⽰Ray和Brian。class Address {
var fullAddress:String
var city:String
init(fullAddress:String, city:String){
lf.fullAddress = fullAddress
lf.city = city
}
}
描写夏天的句子
class Person {
var name:String
var address: Address
init(name:String, address: Address){
lf.name = name
lf.address = address
}
}
var headquarters = Address(fullAddress:"123 Tutorial Street", city:"Appletown") var ray = Person(name:"Ray", address: headquarters)
var brian = Person(name:"Brian", address: headquarters)
假设Brian移动到街对⾯的新建筑,所以你更新代码如下:
brian.address.fullAddress ="148 Tutorial Street"
问题是,这样做有什么问题吗?
Answer:
ray也搬到了新⼤楼! Address是⼀个类,有引⽤语义,所以headquarters是相同的实例,⽆论你通过ray或brian访问它。改变headquarters的地址将改变它们。你能想象如果brian得到ray的邮件会发⽣什么,反之亦然?
解决⽅案是创建⼀个新的地址分配给Brian,或者将Address声明为结构体⽽不是类。
中场:
现在要加⼤难度了。你准备好了吗?
Question #1
考虑下⾯的代码:
var optional1:String? =nil
var optional2:String? = .None
nil和.None之间有什么区别? optional1和optional2变量如何不同?

本文发布于:2023-06-24 09:58:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1052613.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   创建   代码   参数   问题   范围   包括   更改
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图