Swift关键字
2016-07-31 本文已影响138人
Isy
//构造方法
init() //构造函数
init?() //可失败的构造函数
init!() //
//通用泛型
id Anyobject
//属性相关
(setter==)(getter==)在swift中被忽略
nullable ?
nonull
未标记 !
//闭包
swift中的闭包默认捕获变量的方式相当于oc中block标记__block方式
//类相关
不能在swift中继承oc的类
如果在swift中遇到oc中不支持的命名可以用@objc(name)为属性、枚举、方法、、起个别名
@nonobjc用来标记oc中不支持
dynamic将属性或者方法标记为dynamic就是告诉编译器把它当做oc里的属性或者方法来使用(runtime)
#keyPath(class.property) == "property"
@IBDesignable
@IBInspectable
@NSCopying
coreData @NSManaged
as
String.Index and Range
NS_SWIFT_NOTHROW 将不会使用swift的异常抛出机制
is isKindOfClass
CF_SWIFT_NAME这个宏可以将c中的属性或者函数转换为swift
Color ColorCreateWithCMYK(float c, float m, float y, float k) CF_SWIFT_NAME(Color.init(c:m:y:k:));
如果使用了NS_ENUM 在swift中被处理为对应的枚举,没有NS_ENUM会翻译成为结构体
NS_OPTIONS修饰的枚举,在swift中是OptionSet类型结构体。
将oc的方法或使用 NS_SWIFT_UNAVAILABLE()可以让他在swift中不可用
将oc的方法或者属性使用NS_SWIFT_NAME()可以为他们在swift中命一个别名
// return:返回aString的索引,如果未找到的话则返回 NSNotFound // 注:NSNotFound在Objective-C中定义为NSIntegerMax,我们在期望此方法在Swift中调用能返回nil 重定义Objective-C接口
- (NSUInteger)indexOfString:(NSString *)aString NS_REFINED_FOR_SWIFT;
@available()属性声明来指定可用性信息。例如:
@available(iOS8.0,OSX10.10,*)
funcstartUserActivity()->NSUserActivity{
...
}
@INLINE
这个属性提供编译器内联提示。有效的值为 __always
和 never
。除非我非常确定需要,否者我不会使用这个(特别是 __always
)。关于它的使用方式还不是很清楚。在一些有限的测试中它还能生效,但不同测试环境效果也可能不同。
修改:进一步解释,尽管 LLVM 有强制内联的概念,但我们现在并不清楚这个属性是否与其直接关联。我们也不清楚是否有大小限制导致编译器忽略它,跳过内联。理论上它本应该有这个行为,但是我不敢保证它有。
记住 @inline
属性在 debug 编译下会被忽略(当 optimization 被关闭)。
(译者注:关于 optimization 可以看[这篇文章](http://ios.jobbole.com/81937/))
@TRANSPARENT
我原本不把这个列入清单。它会使编译器更早地在构建流程中进行内联函数。它的作用是使[“像(Int, Int)这种非常简单的函数”不应该是一个独立的函数”](https://devforums.apple.com/message/988972#988972)
@transparent
函数是内联的,即使是在没有 optimization 的 debug 模式下, 所以像 1 + 1
这种简单函数也可以调用运行很快. 否则它的作用就像是 @inline(__always)
.
@AVAILABILITY
这个属性标记那些只在某些特定版本或平台上有效的对象。第一个参数是平台。可以是*
(所有)、iOS
或 OSX
。如果需要针对多个不同平台,可以指定多个 @availability
属性。
第二个参数可以是 unavailable
,表明对于给定的平台不可用。相对地,你可以声明一个或多个版本的组合:introduced
, deprecated
, 和 obsoleted
。Obsoleted 意味着已被移除,deprecated 表示如果使用就会给出警告。最后一个参数你可以添加 message
,当被使用的时候,编译器会输出这些提示。一些例子:
@availability(*, unavailable)
func foo() {}
@availability(iOS, unavailable, message="you can't call this")
func foo2() {}
@availability(OSX, introduced=10.4, deprecated=10.6, obsoleted=10.10)
@availability(iOS, introduced=5.0, deprecated=7.0)
func foo3() {}
@asmname
该属性给出了函数、方法或属性实现的符号名称。如果你已经知道对应的函数参数及其类型,那么就可以直接调用Swift的内部标准库函数,甚至不用头文件,也可以方便地调用C语言编写的函数:
[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
@asmname("function") func f()
@unsafe_no_objc_tagged_pointer
上面这个仍然是个谜,但我猜测它是在告诉Swift与Objective-C联系的时候不要使用tagged pointer。
@semantics
这又是另一个谜。参数看起来像是array.mutate_unknown或array.init这样的字符串数组。想必这是要告诉编译器(或静态分析器)函数是如何工作的。
@autoclosure 关键字,是 Swift 引入的一个便捷操作,旨在让我们使用闭包作为参数的时候,更加的方便,简化语法形式,我们就来看看如何使用吧。
@warn_unused_result 函数返回值
warn_unused_result你可以为方法添加这个属性,这样当你对函数不正确调用,或者调用该方法却没有使用它的结果时,就会获得提醒。message 参数用来提供当你调用方法却没使用结果时编译器给出的警告。
mutable_varient 用来提供你所使用的non mutating 方法的mutating 版本方法的名字。比如,Swift标准库里面提供mutating 方法SortInPlace() 和 non mutating方法 sort() 如果你调用sort() 但却并没有用到它的结果,编译器就会猜测你想用的是SortInPlace()。