swift里面没有performselector 线程,有替代的函数吗

2868人阅读
Swift入门教程(29)
原创blog,转载请注明出处
最近在用swift写代码,虽然遇到一些问题,但是代码量确实减了不少。
swfit入门教程系列会随着我使用swfit中的积累,不断地去修正更新
之前的教程
在swift中,函数有关键字func声明
格式
func 函数名(参数1,参数2,...)-&返回值{
func firstFunction()-&Int{
var result = 4
return result
println(firstFunction())//调用参数为空,返回值为Int
在Swift中,函数可以有任意类型的参数,因为Swift定义函数本身是一种类型,所以函数本身也可以返回
函数,或者一个函数作为另一个函数的参数
一、常见的使用函数方式
1、无参数,返回值为空
没有返回值的时候-&可以省略
func hwcFunction(){
println(&Hello hwc&)
2、多个参数,返回值唯一
func hwcFunction(first:String,second:String)-&String{
return first+second
println(hwcFunction(&hello&,&hwc&))
3、多个参数,多个返回值
在Swift中,多个返回值常用元组来返回
func hwcSwapString(first:String,second:String)-&(String,String){
return (second,first)
var (second,first) = hwcSwapString(&first&,&second&)
二、外部参数
从上面的例子中,我们发现,使用的时候我们并没有看到参数的信息,就是我们并不知道第一个参数是什
么意思,第二个参数是什么意思。外部参数可以完美解决这个问题
我们来举个例子
func addPersonalInformation(Name:String,Sex:String)-&String{
return Name+&:&+Sex
addPersonalInformation(&WenchenHuang&,&Male&)
比如输入WenchenHuang Male则返回WenchenHuang:Male.
但是,由于没有提示信息,我并不知道第一个参数是代表名字,第二个参数代表性别,这时候可以用外部
func addPersonalInformation(name Name:String,sex Sex:String)-&String{
return Name+&:&+Sex
addPersonalInformation(name:&WenchenHuang&,sex:&Male&)
调用的时候一目了然,知道哪一个参数代表什么意思
但是这样写仍然比较麻烦,我们不得不为同一个参数提供内部和外部两个名字
Swift为我们提供了一种简写外部参数的方式
只需要在内部参数前加上前缀,内部参数在调用的时候会体现
func addPersonalInformation(#name:String,#sex:String)-&String{
return name+&:&+sex
addPersonalInformation(name:&WenchenHuang&,sex:&Male&)
三、默认参数与变量参数
默认参数就是对参数有个默认值,在函数调用的时候,可以给这个参数传值,也可以不传,不传的时候使
用默认值
举个简单的例子
func hwcPrint(toPrint:Int = 10){
println(toPrint)
调用的时候
hwcPrint()//输出10
hwcPrint(toPrint:11)//输出11这里,我们不难看出,在调用的时候swift自动为我们生成了一个外部参数的名称
这是swift的一个特点:默认参数生成一个外部参数名称
可以使用下划线作为默认参数的外币名称,这样swfit不会提供外部参数名称,但不建议这么做
在swift中,函数传入的参数本身是常量,在函数中不能改变,如果想要让该参数作为可修改的副本,则添
注意:一个函数最多只能有一个可变参数,且必须为最后一个,为了减少内容歧义
func hwcPrint(toPrint:Int){
toPrint = toPrint+1//Wrong
println(toPrint)
func hwcPrint(var toPrint:Int){
toPrint = toPrint+1//Right
println(toPrint)
四、可变参数
所谓可变参数,就是想很多脚本语言那样,参数个数不明确,而在函数体内部,参数保存在一个数组里
可变参数用...表示
func addMultiString(toPrint:String...)-&String{
var resultString:String = &&
for tempString in toPrint{
resultString+=tempString
return resultString
var result1 = addMultiString(&hello&,&world&)
var result2 = addMultiString(&Wen&,&chen&,&Huang&)
五、输入输出参数inout
这类参数传入原值得引用,函数内对传入参数的操作会改变原始值,传入引用的时候需要使用&
func addOne(inout input:Int){
var test1 = 10
addOne(&test1)//test1 = 11
func addOne(var input:Int){
var test2 = 10
addOne(test3)//test2 = 10
六、函数类型
前面提到过,在swift中函数本身就是一个类型,类似于C语言中的函数指针
BTW:函数类型的理解对后面闭包的理解很重要
例如:上面的函数func addOne(input:Int)
函数类型就是(Int)-&()
所以,我们可以像其他类型一样使用函数类型
var add:(Int,Int)-&Int 声明一个入口参数是Int,Int返回值是Int的函数类型变量add
同样,函数类型也可以作为参数传递给函数
func addThree(addTwo:(Int,Int)-&Int,thrid:Int)-&Int{
return addTwo+thrid
函数类型也可以作为返回值
这里采用Apple官方文档里的说明:
func stepForward(input: Int) -& Int {
return input + 1
} func stepBackward(input: Int) -& Int {
return input - 1
func chooseStepFunction(backwards: Bool) -& (Int) -& Int {
return backwards ? stepBackward : stepForward
let moveNearerToZero = chooseStepFunction(currentValue & 0)
七、函数嵌套
何为函数嵌套,就是在函数里定义函数,默认嵌套的函数对外不可见,但是可在函数内部调用。
对上面函数进行重写
func chooseStepFunction(backwards: Bool) -& (Int) -& Int {
func stepForward(input: Int) -& Int {
return input + 1
func stepBackward(input: Int) -& Int {
return input - 1
return backwards ? stepBackward : stepForward
八、Selector
在swift中,建议不在使用selector,因为其不是类型安全的。但是对于熟悉Objective-C的程序员同学来说,很多方法讲不能调用,对此,swift对objective-C的selector直接传入函数名
myButton.addTarget(self, action: &buttonTapped:&, forControlEvents: .TouchUpInside)
let timer = NSTimer(timeInterval: 1, target: self, selector: &test&, userInfo: nil, repeats: false)
func test{
//Do something
function buttonTapped(sendr:AnyObject){
//Do something
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:366511次
积分:7080
积分:7080
排名:第2058名
原创:256篇
评论:95条
文章:54篇
阅读:84602
阅读:2008
阅读:17422
文章:14篇
阅读:33713
文章:14篇
阅读:28595
文章:18篇
阅读:27389
(5)(6)(4)(5)(1)(2)(4)(8)(13)(11)(7)(6)(9)(10)(21)(15)(17)(10)(15)(15)(25)(27)(17)(3)swift同步方法的异步使用_swift吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:31,002贴子:
swift同步方法的异步使用收藏
不要被标题骗了,swift是没有这个功能的。swift里没有performSelector,所以我们只能手动实现这个功能。对于异步使用,我们需要实现一个方法:异步调用接口(这里依swift的命名习惯叫做call_async)这里我们需要泛型和swift参数推演的帮助。void call_async&Argument,Result&(param:Argument,function:(Arguments)-&(Result),complete:(r:Result)-&( ))这是一个诡异的参数列表,但它的确可以工作(尽管我的Xcode因此崩了几次)param表示方法的参数。问:我想要多传几个参数怎么办?请使用元组。function表示要传入的方法。complete表示一个回调,它以方法的返回值作为参数。它在异步调用完成后被调用。其实实现就很好猜了。正规的应该使用NSThread。不过这里就偷懒使用GCD了。实现dispatch_async(dispatch_get_global_queue(0,0)){complete(function(argument))}如你所见,该方法返回void,所以你只能在回调中接收这个返回值。另一点需要提醒的是,操作UI时请回到主线程。
刘备:军师,此次伐魏你有何妙计?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或发送私信成功
为了尽快解决大伙儿的问题,请务必要找相对应的客服哦~
swift3.0和Objective-C的交互需要注意这些
16:01 && 浏览量(212) &&
Swift3.0出来后, 可以看到改变很大, 和cocoa, Foundation...的交互也变得更方便了, 同时Swift编写的应用适配到iOS 7, 所以, 我们可以相信: 在未来使用swift的情况会逐渐增加了, 同时会涉及到OC和Swift在项目中并存的情况, 这里我重新读了官方的'Using swift with Cocoa and Objective-C(swift3)'的文档, 记录了一些个人觉得比较常用的笔记, 请大家选择性阅读(里面的代码 均来自文档)
· OC的初始化方法在Swift中被引为
init(...)&---&如果初始化不会失败
&init?(...)&---&如果初始化可能失败
&init!(...)&---&否则
· oc中的property里的(getter==, setter==)将会被swift忽略
· id对应Anyobject 但是所有的Anyobject在swift中是可选值, 如果之前的值为可选值, 在被设置为Anyobject后就是多重可选值了
· oc中的属性被标记为
nullable&-&&在swift中相当于&?
nonnull&-&&在swift中相当于&非可选属性
未标记&-&&在swift中相当于&!
· oc中的轻量级泛型也是对应与swift中的泛型
@property&NSArray&*dates
对应于&&var&dates:&[Date]
· swift 中的闭包默认捕获变量的方式相当于 oc中block中捕获被标记为 __block的变量方式 -& 就是说 闭包捕获到的是变量的指针
· swift中只要不是在多线程中, 建议使用[unowned self]来避免循环引用, 多线程中, 建议使用[weak self]
· == 操作符相当于oc中的isEqual: --- 即比较内容是否相等;=== 相当于oc中的指针比较
· 继承自NSObject的子类如果重写了isEquals:方法, 应当提供 hash 这个属性
· 不能在oc中继承swift的class
· 如果在swift中遇到oc中不支持的命名 可以利用 @objc(name)为他(属性 枚举, 方法名...)名个别名
· @nonobjc 用来标记oc中不支持的
· dynamic 将属性或者方法标记为dynamic就是告诉编译器把它当作oc里的属性或方法来使用(runtime),
· 当需要使用 KVO 或者 runtime的时候需要这样处理
· 当使用oc的 perform(selector, with:)方法的时候会返回一个可选值(指向AnyObject的指针);但是使用perform(:on:with:waitUntilDone:modes:) and perform(:with:afterDelay:)不会返回可选值
· 使用 #keyPath() 可以转换为string, #keyPath(class.property) == "property"
· 可用于KVC 例如person.value(forKey: #keyPath(Person.name)) = person.name
· 但是测试了下不能修改swift中的只读属性 不知道有什么方便的用处
· NSClassFromString("MyFramework.MyClass")
· @IBDesignable 用在class(UIView的子类)声明的前面, 然后就可以在storyBoard中的inspector编辑它;@IBInspectable 用在(UIView的子类)的属性前面, 然后就可以在storyBoard中的inspector编辑它 ,就想系统提供的可以设置颜色,字体...
· swift中的属性默认是strong类型, 只有可选类型才能被标记为weak
· oc中的 copy属性 转换为swift中的@NSCopying 必须遵守NSCoding协议
· 使用Core Data的时候所有的属性和方法需要标记为 @NSManaged
· 文档中指出"The corresponding reference types can be accessed with their original NS class name prefix."但是beta版本中不能很好的使用NS开头的
· 在oc和swift的桥接类型之间 直接使用 as 可以相互转换
· 因为swift中的String和NSString使用的编码方式不一样,所以在swift中要对string使用索引的时候 不能直接使用 Int 或者NSRange
· 需要使用String.Index and Range
· swift会将Double, Int, Bool, Uint, Float和NSNumber桥接, 所以可以直接将
· 这些类型的值使用 as NSNumber转换为NSNumber, 但是逆向进行是得到的可选值 as?
· Foundation 和Core Foundation 之间的类型有toll-free bridge('免费桥')
· Foundation中的常量, 在swift中被换为类嵌套的枚举:NSJSONReadingOptions ----- && JSONSerialization.ReadingOption
· swift中使用 Core Foundation
· 如果使用swift处理过的函数不用我们手动管理内存分配;否则需要我们处理
· 区分的方式: 当返回值是 Unmanaged的时候说明需要我们处理
· 处理方法: 在使用返回的值之前调用他对应的takeUnretainedValue() 或takeRetainedValue()即可
· 例如let memoryManagedResult = StringByAddingTwoStrings(str1, str2).takeUnretainedValue()
· swift中Core Foundation里的类型 Ref后缀被去掉了 例如 CFTypeRef -& CFType
· 在oc的方法 使用 NS_SWIFT_NOTHROW , 将不会使用swift的异常抛出机制
· swift中直接使用 is 来实现oc中isKindOfClass: 的功能
· swift中使用kvo的条件: 1.必须继承自NSObject 2. 被观察的属性 要被标记为 dynamic
· swift 中的单例很简单:
class&Singleton&{
&&static&let&sharedInstance&=&Singleton()
class&Singleton&{
&&static&let&sharedInstance:&Singleton&=&{
&&&&&&let&instance&=&Singleton()
&&&&&&//&setup&code
&&&&&&return&instance
· swift和C的交互: c的函数在swift中均为全局函数
· 使用CF_SWIFT_NAME 这个宏可以将c中的属性或者函数转换为swift中
Color&ColorCreateWithCMYK(float&c,&float&m,&float&y,&float&k)&CF_SWIFT_NAME(Color.init(c:m:y:k:));
对应为swift中
extension&Color&{
&&init(c:&Float,&m:&Float,&y:&Float,&k:&Float)
· c语言中的枚举 如果使用了NS_ENUM定义, 则在swift中被处理为对应的枚举
· 如果没有使用NS_ENUM定义, 则被处理为结构体
typedef&NS_ENUM(NSInteger,&UITableViewCellStyle)&{
&UITableViewCellStyleDefault,
&UITableViewCellStyleValue1,
&UITableViewCellStyleValue2,
&UITableViewCellStyleSubtitle
enum&UITableViewCellStyle:&Int&{
&&case&`default`
&&case&value1
&&case&value2
&&case&subtitle
typedef&enum&{
&MessageDispositionUnread&=&0,
&MessageDispositionRead&=&1,
&MessageDispositionDeleted&=&-1,
}&MessageD
struct&MessageDisposition:&RawRepresentable,&Equatable&{}
var&MessageDispositionUnread:&MessageDisposition&{&get&}
var&MessageDispositionRead:&MessageDisposition&{&get&}
var&MessageDispositionDeleted:&MessageDisposition&{&get&}
c中的被NS_OPTIONS修饰的枚举, 在swift中是OptionSet类型, -& 即可以使用数组方式选多个值
typedef&NS_OPTIONS(NSUInteger,&UIViewAutoresizing)&{
&&&&&&UIViewAutoresizingNone&&&&&&&&&&&&&&&&&=&0,
&&&&&&UIViewAutoresizingFlexibleLeftMargin&&&=&1&&&&0,
&&&&&&UIViewAutoresizingFlexibleWidth&&&&&&&&=&1&&&&1,
&&&&&&UIViewAutoresizingFlexibleRightMargin&&=&1&&&&2,
&&&&&&UIViewAutoresizingFlexibleTopMargin&&&&=&1&&&&3,
&&&&&&UIViewAutoresizingFlexibleHeight&&&&&&&=&1&&&&4,
&&&&&&UIViewAutoresizingFlexibleBottomMargin&=&1&&&&5
public&struct&UIViewAutoresizing&:&OptionSet&{
&&public&init(rawValue:&UInt)
&&public&static&var&flexibleLeftMargin:&UIViewAutoresizing&{&get&}
&&public&static&var&flexibleWidth:&UIViewAutoresizing&{&get&}
&&public&static&var&flexibleRightMargin:&UIViewAutoresizing&{&get&}
&&public&static&var&flexibleTopMargin:&UIViewAutoresizing&{&get&}
&&public&static&var&flexibleHeight:&UIViewAutoresizing&{&get&}
&&public&static&var&flexibleBottomMargin:&UIViewAutoresizing&{&get&}
· 在swift中直接使用 &let resize = [. flexibleLeftMargin, . flexibleWidth...]
· 在swift中全局变量和存储属性都被保证只初始化一次,所以用来当作OC里面的#define定义的常量。同时swift全局函数可以当作OC里#define定义的复杂宏(类似函数)
· swift中的条件编译 自定义编译符的方法(例如: DEBUG_LOGGING)
· 首先在project 的设置里面设置swift -D DEBUG_LOGGING to set the DEBUG_LOGGING
· 然后使用 #if DEBUG_LOGGING // 操作 #endif
#if&arch(arm)&||&arch(arm64)
#if&swift(&=3.0)
print("Using&Swift&3&ARM&code")
print("Using&Swift&2.2&ARM&code")
#elseif&arch(x86_64)
print("Using&64-bit&x86&code.)
print("Using&general&code.")
· swift中使用指针的方式
· 使用inout方式 &变量
· 使用UnsafePointer或者UnsafeMutablePointer
例如这个函数接受的参数可以传许多种
let&x:&Float&=&0
func&takesAPointer(_&p:&UnsafePointer!)&{
takesAPointer(&x)
takesAPointer([0.0,1.0])
·&在swift中申明oc中的包含可选实现方法的协议时需要在协议和方法前都标记objc
@objc&public&protocol&MySwiftProtocol&{
//&必须实现
&&func&requiredMethod()
&&@objc&optional&func&optionalMethod()
· 将oc的方法或者属性使用NS_SWIFT_NAME()可以为他们在swift中命一个别名
· 将oc的方法或使用 NS_SWIFT_UNAVAILABLE()可以让他在swift中不可用
& 收藏(0) 收藏 +1 已收藏 取消
& 推荐上头条 推荐 +1 推荐上头条 已推荐
文章上传作者
snoone的热门文章
开发者交流群:
DevStore技术交流群2:
运营交流群:
产品交流群:
深圳尺子科技有限公司
深圳市南山区蛇口网谷万海大厦C栋504
Copyright (C) 2015 DevStore. All Rights Reserved
DevStore用户登录
还没有DevStore帐号?
快捷登录:swift(16)
在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了。更有甚者连IMP, objc_msgSend也不能用了。虽然想不通为什么,但应该有他的道理。就不纠结了。
大家可能在OC中使用得更多的就是延时处理,及后台处理,或线程异步等。现在没有performSelector,哪在swift还有什么可以代替呢,当然有了,如GCD,NSTimer其实都可以近似的代替。
如:NSTimer&
但个人感觉使NSTimer有个传上下文时获取与performSelector不一样。从上下文中拿到的是NSTimer需要再取userInfo才可以。但不管怎么样,可以实现延时处理。
另外,我还自己做了一个swift 的扩展类(OC的catagray) 同样伪装了一个performselector方法。为什么讲是伪装,因为过程中在调用最终的selector时,用了线程处理。而不是理想的msgSend的方式(swift没有开源,没法看到实现,又不提供IMP,查了好多资料都没有讲执行Selector 的,如有大神发现,请告诉我。。。)
测试使用:
警告,如果使用performSelector最终执行的selector是在子线程中,如果seleoctor中有更新UI操作,需要回到主线程。就这点没有伪装好,真失败。。。。
大家在使用过种中请谨慎,别外,如果有发现BUG,请告诉我。。。。。谢谢。
别附swift源码文件位置:
http://download.csdn.net/detail/fengsh998/7569569
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1073561次
积分:11828
积分:11828
排名:第781名
原创:186篇
转载:101篇
评论:256条
(2)(2)(6)(2)(3)(4)(2)(2)(1)(5)(12)(5)(4)(2)(3)(8)(12)(7)(23)(3)(8)(7)(21)(6)(10)(40)(19)(3)(12)(17)(1)(1)(13)(4)(10)(2)(6)(1)(1)}

我要回帖

更多关于 oc performselector 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信