编程

当前位置:永利皇宫463登录 > 编程 > SWIFT世界中的OBJECTIVE

SWIFT世界中的OBJECTIVE

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-12 14:29

本篇文章翻译自:Objective-C in a Swift World原作者:BEN SANDOFSKY

xocde 8.0 出来后,有很多的改变,需要一点一点的去探索与学习。

如果Swift成功了,Objective-C就会离开。它不会被遗弃,而是会去佛罗里达州享受它的退休时光。在无数个白天中运行着有百万行代码的古董级app,在无数个夜晚伴带着没人再敢去重写的OAuth库,小口的抿着玛格丽塔。直到多年以后,打开iOS 的发行说明,你会看见在仆告栏中写着Objective-C辞世了。于是它就这样的离开了我们。

  • 在 swift 中'?'相当于可选类型, optional;
  • '?'的使用场景:当我们声明变量的时候,且又不想为变量赋初值;
  • 在 swift 打印的结构中, nil 实际上就是一个枚举值
  • 可选类型 optional 实际上是一个枚举类型,给枚举类型中有两个枚举值: none 和 some; 如果为 none 时,就说明未赋初值(该变量中目前无值),some 说明该变量已经进行了初始化赋值.
  • '?',其实是可选类型的语法糖形式, var optional<Int>等同于 var a:optional<Int>

Xcode 8.0 未修改配置直接编译会出现下面的警告:(我这人有点毛病,就是不喜欢警告打印出来)

iOS的交叉编译工具链(toolchain)一直支持多语言,每种语言解决不同问题。C++是为跨平台的app服务,尤其是游戏。如果你需要提高性能或是位操作(bit fiddling),就用C语言。

运行xcode8遇到这个警告:

Apple没说过"Objective-C和Swift是分别用来针对不同问题的"。2014年WWDC的演讲中,Swift第一次被描述为"现代的"。今年则是"写的更快,更易维护"。Apple说这两种语言它都喜欢,却把最好的成年礼给了swift。

var a:Int? = 9
print(a)  //结果为 optional(9)

subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

双语言环境分裂了iOS开发者社区。你的公司可以决定使用其中一种,让剩下50%的开发者苦恼,或者两种都支持,然后在琐碎的style guide上多花一倍的时间。

  • 如果我们将一个变量声明为可选类型,实际上是给变量目前就是一个枚举值:当我们在使用的时候,希望使用的就是我们声明的类型,例如在该处的 Int 类型;这个时候我们就需要解包' ! ',将枚举类型转换我们所期望的类型
  • 这个转换实际上就是类型与类型之间的转换,在强制解包的时候,我们要保证变量有值,也就是保证变量为 optional.some;

subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

如果长远目标不是用来取代Objective-C的话,Apple也不会在Swift上投资。Apple还没做好准备这么说,因为他们知道事实有可能不是这样。他们不想重蹈Mac OS X 10.5中引入的垃圾回收器(garbage collector)在10.8中遗弃,又在10.10中移除这样尴尬的覆辙。对系统而言是更好,不过你还是和那些用了垃圾回收器然后又被迫放弃的衰人们这么说吧。

subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

我们正处于developer advocacy(*大意是有部分开发者置身于做出更利于其他开发者开发的各类平台,工具,开源软件,第三方API等等

print(a!)// 所得到的结果就为9

subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

  • 译者注*)的第一阶段。Apple开始说,"你应该看看Auto Layout!"之后他们收集了一年的反馈,修好了bug和使用上的不便,接着说,"你现在应该是正用着Auto Layout呢。"然后他们发布了不同尺寸的iPhone。"真的建议你用Auto Layout了,顺便再看看size classes!"哦看呐,iPad的多任务就是用size classes做的。
  • 注意
    • 当我们为可选类型赋值之后,就等同于: optional.some = 初值;那么打印出来的形式为 optional(初值).
    • 相反我们在打印的时候,进行解包' ! ' => 本质上就是取出 optional.some 中的值,打印出来的形式 ----初值----

subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

Swift在它的初期采用者中很成功,但是稍大的公司都是"再等等看"。如果Apple决定了正式宣布swift就是被选中的语言,这事儿必须一次成。让你的CTO看上Xamarin(*一个有跨平台能力的开发平台,可以做到一次编码,iOS、Android和windows通用

译者注)可是一个极难的过程。"啥?iOS用两种语言?那把它写进.Net里然后全公司统一(意思是有这么简单就好了

  • 译者注*)!"

Swift从Python3的惨败中吸取了很多经验。在Python3发布6年之后,68%的开发者的项目还是用Python2.x写的。其中的一个问题是与第三方库后向兼容性,如果不支持Python3的话它们根本就用不了。

因此Swift就必须要有完美的后向兼容性,实际上这点Apple做的很棒。它是显得那样的神奇,可出现问题之后就不是了。我浪费了一个小时尝试用swift与C函数指针做互操作,最终放弃,退而求其次用了Objective-C。我做的每一个Swift 1.2的项目都需要自己写的这些Objective-C的小补丁。

时至今日,如果不先成为一个Objective-C开发者的话你是成为不了一个Swift开发者的。而在Apple正式说"用Swift吧"之前,你需要锻炼出只用Swift就能完成开发的能力。他们正在大步前进:我的函数指针挣扎了几周之后,Swift 2.0的发布就把我的这个问题解决了。

Python 3的另外一个问题是你不能去说服一个社区把现有的一切都丢弃掉,重写那些已能完美运行的代码,除非报酬极高。Python 3语言的纯度还不高。"没错,它挺酷的,但要用它我还得过来把它装载起来。"

Swift小组选取了高格调却更困难的方式。Joe Groff说,"如果它确实好,我们就不需要强迫人们去使用它。"

最快实现这个的方法是让swift在开放世界的app中反复的迭代运行。但是Swift想要彻底改变现有语言环境需要的是一个没有常年反对声音的自由环境。Apple需要人们去用Swift,太多人还不行,而且这些人还得了解即将进入的这个领域。于是我们现在就处于一种"Objective-C暂时哪儿也不会去,但是你真应该试试Swift!"的中间立场。

Swift会迎来一个引爆点。当Objective-C的搬迁已经完美,开发者求着经理要swift的开发许可时,Apple会说: "你现在就应该用着Swift呢",然后推崇大家放弃Objective-C。多年以后Objective-C可能会被遗弃,但是永远也不会被移除。它依然给iOS提供性能,而且OS X依然还运行着部分Carbon(MAC系统的一种API - 译者注),即使后者被官方宣布弃用。

当我发了一条Objective-C终将离开的twitter时,我也开启了互联网最爱的娱乐时间:"告诉你,你错了。"我选词还是很慎重的。Objective-C的离开,不会是因为官方宣布弃用它了,而是由于它本身变得无足轻重。

如果你坚持用Objective-C,有3种事情可能会发生:

  • Swift失败了,然后消失了:漂亮!你会是一个娴熟的工程师,而且为公司节省了时间、金钱,还消除了风险。
  • 我们被卡在一个双语言的世界中:你可能会错过一些大的机遇。
  • Swift成功了:Objective-C成了下一个Cobol(一种非常古老的高阶编程语言 - 译者注)。如果你喜欢古董级的程序,在宇宙的热寂来临前你还是能保住你的饭碗的。

什么是投身于Swift的最佳时机?

2005年我在Rails上发现了Ruby。当时是非常前沿的技术,拿来做业务还不是很安全。不过我还是找到机会做了很多项目,一个比一个大。2007年我得到了自己职业上的巨大回报。2009年,我的Rails背景让我在Twitter上找到了自己的职位。

学习超前沿的技术就像给一个创业公司做投资:高风险,高回报。这就是为什么你只在认为赔钱能接受的情况下才去做天使投资的原因。同时还要把你的退休金保存共同基金里。

对Swift先持观望态度是有诸多合理原因的。据大家说swift的每次更新会需要我们用1到2天去做适配。也许你的代码库更加庞大,或者你不能接受更新所带来的中断。目前,完全可以理解。如果你正管理着一家大型公司,去年应该还是"再等等看"。2015年就是你应该加速并安排它未来计划的一年了。此时就是把swift试用在非关键的,green field项目(指受之前项目约束很小的项目 - 译者注)里的恰当时机。

你不需要把一切都押在Swift上,但最好开始尝试它。

去除这些警告的方法:

//当 a 为 nil 的时候,我们要强制解包的话会导致崩溃,所以我们在 输出值的时候,要先进行判断,在此要注意:解包之前的判断,只是为了确定变量有值
var a_1:Int? = 0
if a_1 != nil {
print(a_1! + 1)
}else{
print("未赋初值")
}

//可选绑定,用来判断 b 是否为 nil
如果 a_1等于 nil 的时候,赋值操作失败,如果a_1 != nil, 实际上是讲 a_1! 赋值给 b, 赋值操作成功.
if var b = a_1 {
print("b=",b)
}else{
print("未赋初值--")
}

product -> scheme -> edict scheme -> run -> environment variables 

' ? ' 和' ! '的用法在系统的类型的对象中使用比较频繁

输入:

2.结构体
struct Point {
var _x:Float = 0.0
var _y:Float = 0.0
//CGPointMake(x:y:)
//为结构体增加一个成员方法,类似于 OC 中的实例方法----减号方法
//用 mutating 来修饰成员的方法的作用为:可以在成员方法中修改结构体的成变量的值
mutating func pointMake(x:Float,y:Float) {
_x = x
_y = y
}
//在结构体中,声明的方法如果未加 static 修饰词,该方法就是成员方法(-号方法),如果是有 static 修饰,就是类方法(静态方法)===加好方法
//在任何计算机语言中,类方法中不能使用属性或者是实例变量.因为在执行该方法的时候,不能确定当前类是否被初始化.
//在加好方法中,不能使用属性,成员变量,减号方法
static func jiaHaoMethod() {
print("这是类方法")
// pointMake(&<#T##Point#>)
}

name:OS_ACTIVITY_MODE   

//作用域的范围

value:disable

// public //公众的.将方法声明在. h 中.
// private //私用.讲方法声明在.m 中
// protected //受保护的.子类可以继承该方法.外部无法调用,
}

最后:close

//Point()   ==   alloc init
//初始化一个结构体类型
var mypoint =  Point()
//当结构体中有成员变量的时候,系统也提供了有参数的初始化方式.
var mypoint_1 = Point(_x: 10.0, _y: 20.0)
//使用结构体中的成员变量
//print("mypoint_1.x",mypoint_1.x,"mypoint_1.y",mypoint_1.y)
//var p = mypoint_1;
//p.x = 20.0
//print("p.x",p.x,"mypoint_1",mypoint_1.x)

//为结构体的成员变量赋值
//mypoint_1.x = 20.0

//使用结构体中的成员方法(对象方法)
Point.jiaHaoMethod()
var mypo = Point()
mypo.pointMake(10.0, y: 20.1)
print(mypo)

//静态方法就是类方法.结构体的类方法要用类名来调用.
Point.jiaHaoMethod()

//模仿OC写一个frame,包含了 original 和 size 两个结构体对象, rectmake

重新编译就去除了这些警告了。

本文由永利皇宫463登录发布于编程,转载请注明出处:SWIFT世界中的OBJECTIVE

关键词:

上一篇:没有了

下一篇:没有了