Swift之旅_Welcome to Swift

说来惭愧,用swift开发ios应用已经有2年多了,但是一直没有去看过官方文档,很多语法相关的东西都不知道,直到前段时间去面试被人问起才发现对swift的很多东西都不了解。亡羊补牢未为晚也,思前顾后,决定翻开苹果的swift官方文档来补充swift知识。有兴趣的小伙伴们可以一起阅读并交流,我会在此记录一些个人感觉有用的东西。

Welcome to Swift

打开文档的第一章Welcome to Swift,让我们一起进入swift的世界吧。

About Swift

文章的第一小节About Swift主要介绍一下swift的特性和优点,就是各种自卖自夸它是一种安全、快速、互动的编程语言= =。我们直接跳过它。

Version Compatibility

第二小节主要是说明了swift4的一些新特性,主要是下面三句话。

  • Substring operations return an instance of the Substring type, instead of String.
  • The @objc attribute is implicitly added in fewer places.
  • Extensions to a type in the same file can access that type’s private members.
  • 第一条的我都不用翻译就能看出来,大致意思是在对String做截取等操作时返回的子串现在用Substring代替了String类型了。
let str = "Hello World!"
let subStr = str.prefix(5)

如上代码subStr现在是Substring类型而不是String类型了。其实也纳闷为毛要这样,以后用的时候还要用String()包一下,于是上网查了一下,原来大致用意是这样的,在之前版本中调用字符串对象调用截取等方法操作时返回的子串也会对原字符串保持一个引用,这样原串销毁时内存不能正常的释放(这是我自己看了网上的文章之后的见解,如有问题跪求大神指出)。

  • 第二条相信现在很多朋友也和我一样碰到了,打开项目突然发现#selector 参数指定的实例方法在定义的时候前面都要加上@objc这个前缀了。至于这里为什么要加上这个修饰符本来还不太清楚,网上也没有找到很合理的答案,有大神知道的话希望能够告知一下。
  • 第三条直接音译过来就是“同一文件中类型的扩展可以访问该类型的私有成员。”,在工程中试了一下确实是这样的,但是之前也没有这样写过,也不知道以前是不是在extension中不能访问私有成员的。

A Swift Tour

第三小节对于刚开始学习的同学就比较有帮助了,不过仔细一看发现有一些东西我也是没去接触过= =。记录一些我觉得可能会有点用的东西吧。

  • 字符串可以用”””来表示多行

Use three double quotation marks (""") for strings that take up multiple lines. Indentation at the start of each quoted line is removed, as long as it matches the indentation of the closing quotation marks.

在某些场合用起来还是很方便的。

let str1 = "字符串"
let str2 = """
        这是一串\(str1)
        这也是一串\(str1)
        这还是一串\(str1)
        """
print(str2)
  • 结构体是copy,但是对象是引用的。

Use struct to create a structure. Structures support many of the same behaviors as classes, including methods and initializers. One of the most important differences between structures and classes is that structures are always copied when they are passed around in your code, but classes are passed by reference.

这段话大致意思上是struct和class非常相似,一样拥有方法和初始化方法。其中一个最大的不同点是struct是通过copy的形式赋值的,而class则是引用。class引用大家都知道,所以证明一下struct就行。

struct Person {
    var height: Float
    var age: Int
}

class Student: NSObject {
    var height: Float
    var age: Int
    
    init(height: Float, age: Int) {
        self.height = height
        self.age = age
        super.init()
    }
}
let p1 = Person(height: 150, age: 25)
var p2 = p1
p2.age = 30
        
let s1 = Student(height: 150, age: 25)
let s2 = s1
s2.age = 30

可以看到p2更改后不会影响p1,但是s1更改后却影响到了s2。

  • 变异类型

Notice the use of the mutating keyword in the declaration of SimpleStructure to mark a method that modifies the structure. The declaration of SimpleClass doesn’t need any of its methods marked as mutating because methods on a class can always modify the class.

结构体和枚举的实例方法中默认不能直接改变自己的属性,如果要改变需要在方法前面加上mutating,代码实践中得知确实是这样的,如图:
  • defer

Use defer to write a block of code that is executed after all other code in the function, just before the function returns. The code is executed regardless of whether the function throws an error. You can use defer to write setup and cleanup code next to each other, even though they need to be executed at different times.

defer代码块中的代码是在一个方法return之后再调用的,无论函数是否抛出错误,都执行该代码。

func test() {
    defer {
        print("defer执行!")
    }
    print("函数执行完毕!")
}

调用后执行结果如下:
  • where

Use where right before the body to specify a list of requirements—for example, to require the type to implement a protocol, to require two types to be the same, or to require a class to have a particular superclass.

大致意思上就是条件限制吧(不敢解释太多,怕出错= =)。主要用在do catch、switch、fo循环以及泛型等方面。但是文档给的案例我看的不是很明白。

func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }
            }
        }
        return false
}
anyCommonElements([1, 2, 3], [3])

Sequence貌似是一个协议,一些集合都遵守这个协议,然后这里的where是貌似是限制了两个条件,T.Iterator.Element: Equatable,还有后面的类型相同,不知道这样解释对不对,知道的大神跪求解释一下= =。我自己写了一个比较简单的。

let array = [1,2,3,4,5,6,7,8,9,10]
for element in array where element >= 3 {
        print(element)
}

这样一看就比较清晰了嘛。

最后补充

最后补充一个东西给初学者吧

This version of the Shape class is missing something important: an initializer to set up the class when an instance is created. Use init to create one.

class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

Notice how self is used to distinguish the name property from the name argument to the initializer. The arguments to the initializer are passed like a function call when you create an instance of the class. Every property needs a value assigned—either in its declaration (as with numberOfSides) or in the initializer (as with name).

关于创建一个实例的时候官方文档是这么解释的。大致上的意思呢就是说在创建一个实例的时候,一定要对每个成员分配一个值。就是说在初始化方法完成之前,每个成员都必须要有值,当然也可以将其声明为Optional(可选类型)或者在定义的时候就可以给他赋一个值,就不用在init方法中初始化了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容