消息关闭
    暂无新消息!

有木有swift大神

问题作者 : 梅子2017-07-16发布
请问一下swift的这句代码是什么意思?看不懂

var onNFCResult: ((Bool, String) -> ())?

这是定义一个方法吗?  那我要写成oc的代码该怎么写呢
然后下面再调这个方法又该怎么改成oc的呢
guard let onNFCResult = onNFCResult else { return }

5个回答

︿ 3
var onNFCResult: ((Bool, String) -> ())?
var是定义变量的关键字,所以onNFCResult是个变量,后面的?表示这个变量有可能是nil,是个可选类型
这一句的关键是这个变量的类型,其实他就是一个函数,意思就是onNFCResult的类型是个函数,这个函数有两个参数,一个布尔型,一个字符串类型,没有返会值,在变量解包之后,你可以直接像这样调用
onNFCResult(true,"aaa")
后面一句就是对变量解包的语句

guard let onNFCResult = onNFCResult else { return }
guard是swift新增的保留关键字,简单的理解就是守护的意思,这一句等价于
if let onNFCResult = onNFCResult else { return }
因为前面定义的时候onNFCResult是可选类型的,就是后面有个问号,在swift中你要很小心,可选的xx类型和xx类型并不是同一种类型的数据,比如
var a:Int
var b:Int?
那么a和b并不是是同一种类型的数据,只有b强制解包之后才是Int类型,上面那个语句就是强制解包的语法,意思就是onNFCResult为nil的话就直接return,有值的话这个语句并没做处理,正常的写法应该是
if let onNFCResult = onNFCResult
{
    do somethong...
    onNFCResult(true,"aaa")
}
 else { return }
他这个语句很明显就是要保证onNFCResult不为nil,否则就直接放回,所以他这个语句可以直接简化为
if onNFCResult == nil then {return}

另外let后面那个变量是可以随便取的,比如这样
if let bbbbb = onNFCResult else { return }
如果你只是要用解包的语法来判断是不是为nil,并不需要用到这个变量的话,你可以用_来忽略他
if let _ = onNFCResult else { return }

︿ 1
var onNFCResult: ((Bool, String) -> ())?
这句话是声明一个可变参数,参数名是onNFCResult,参数类型是((Bool, String) -> ())类型的,swift语言允许声明方法变量,也就是把一个方法声明成一个变量
这个方法需要有2个参数,一个bool类型,一个字符串类型
︿ 1
oc的话可以用block来对应,没啥特别的

swift我也只是皮毛,如果有不对的地方欢迎楼下的指正
︿ 0
第一句应该相当于oc中的block声明吧  
typedef void(^onNFCResult)(BOOL, NSString*);

第二句应该如2楼所说是一个判断 在oc中应该是这样
if (! _onNFCResult) {
        return;
    }


鄙人拙见  不知道对不对  还望楼下继续指正