Swift: 方法调用之UnsafePointer

muyu114 2019-05-13 04:57:31
方法声明:
@objc optional static func isKeyExcluded(fromScript name: UnsafePointer<Int8>) -> Bool

测试1:
if let isExcluded = cls.isKeyExcluded(fromScript:), name.withCString(isExcluded) {
return true
}
测试1正常使用,这个方法始终没有想明白,前面的参数传入的是哪个,我调试的时候发现isKeyExcluded用的貌似是name;还有后面的withCString怎么能使用一个bool的返回值(单独使用报错);

测试2:
var name = "TEST"
let test1 : Bool
test1 = true
let isExcluded = cls.isKeyExcluded(fromScript:)
let test2 = name.withCString( test1 ) //错误信息: Cannot convert value of type 'Bool' to expected argument type '(UnsafePointer<Int8>) throws -> _'
测试2提示以上错误信息,估计和指针有关系;swift中的指针使用貌似和 oc有点不一样,UnsafePointer<T>;

请各位大虾指教
...全文
2973 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
muyu114 2019-05-21
  • 打赏
  • 举报
回复
引用 18 楼 iamnobody 的回复:
let isExcluded = cls.isKeyExcluded(fromScript:) // isExcluded 是函数类型,是可以被调用的,或者说是闭包你可能会比较了解一点,函数是一种特殊的闭包。 isExcluded("123") // 在witchCString函数里面,是这样调用传进来的闭包的。
谢谢
iamnobody 2019-05-17
  • 打赏
  • 举报
回复
let isExcluded = cls.isKeyExcluded(fromScript:) // isExcluded 是函数类型,是可以被调用的,或者说是闭包你可能会比较了解一点,函数是一种特殊的闭包。
isExcluded("123") // 在witchCString函数里面,是这样调用传进来的闭包的。

muyu114 2019-05-17
  • 打赏
  • 举报
回复
引用 16 楼 iamnobody 的回复:
这个isExcluded 是可选类型,所以要写成 name.withCString(isExcluded!) 为什么在if里面就不是可选类型了,这个知识点叫 可选绑定,你可以查一下
public func withCString<Result>(_ body: (UnsafePointer<Int8>) throws -> Result) rethrows -> Result 非常谢谢你的讲解, 可选绑定这块明白了,但是关于name.withCString(isExcluded)这个使用了前面的方法引用isExcluded作为参数,但是无法理解,let isExcluded = cls.isKeyExcluded(fromScript:)的参数是怎么穿进去的
iamnobody 2019-05-16
  • 打赏
  • 举报
回复
cls.isKeyExcluded(fromScript:)
这里是没有参数的,这个不是函数调用,而是获得这个函数本身,它这个表达式的类型是
(UnsafePointer<Int8>)->Bool
是一个函数类型。

详情可以看一下下面的 关于函数名的描述。
http://wiki.jikexueyuan.com/project/swift/chapter2/06_Functions.html

但是这个获得成员函数的写法看起来确实很像调用,官方文档好像也没有说到这点,忘了在哪里看过了。
muyu114 2019-05-16
  • 打赏
  • 举报
回复
引用 9 楼 iamnobody 的回复:
刚刚注意到,是我搞错了,不好意思,他这里的isExcluded 不是一个Bool 类型,是一个 (UnsafePointer<Int8>)->Bool 类型的函数变量。 所以他是可以传给withCString的
而且isExcluded声明的时候参数name是UnsafePointer<Int8>,返回类型是bool,这里有点懵
muyu114 2019-05-16
  • 打赏
  • 举报
回复
引用 9 楼 iamnobody 的回复:
刚刚注意到,是我搞错了,不好意思,他这里的isExcluded 不是一个Bool 类型,是一个 (UnsafePointer<Int8>)->Bool 类型的函数变量。 所以他是可以传给withCString的
但是我怎么调试的时候出现了 if let isExcluded = cls.isKeyExcluded(fromScript:), name.withCString(isExcluded) { return true } isKeyExcluded(fromScript:),这个方法使用的是name,这个是什么调用方法,太诡异了
iamnobody 2019-05-16
  • 打赏
  • 举报
回复
这个isExcluded 是可选类型,所以要写成 name.withCString(isExcluded!)

为什么在if里面就不是可选类型了,这个知识点叫 可选绑定,你可以查一下

muyu114 2019-05-16
  • 打赏
  • 举报
回复
引用 14 楼 iamnobody 的回复:
name.withCString(isExcluded) 这个才是调用isExcluded的地方。你把两行分开来写就知道了。
分开两行写,报错 let isExcluded = cls.isKeyExcluded(fromScript:) name.withCString( isExcluded ) //错误信息: Value of optional type '((UnsafePointer<Int8>) -> Bool)?' must be unwrapped to a value of type '(UnsafePointer<Int8>) -> Bool'
iamnobody 2019-05-16
  • 打赏
  • 举报
回复
name.withCString(isExcluded)
这个才是调用isExcluded的地方。你把两行分开来写就知道了。
muyu114 2019-05-16
  • 打赏
  • 举报
回复
引用 12 楼 iamnobody 的回复:
cls.isKeyExcluded(fromScript:) 这里是没有参数的,这个不是函数调用,而是获得这个函数本身,它这个表达式的类型是 (UnsafePointer<Int8>)->Bool 是一个函数类型。 详情可以看一下下面的 关于函数名的描述。 http://wiki.jikexueyuan.com/project/swift/chapter2/06_Functions.html 但是这个获得成员函数的写法看起来确实很像调用,官方文档好像也没有说到这点,忘了在哪里看过了。
我开始也是这么认为的,不过调试发现,下面这行代码运行的时候进到isKeyExcluded里面了,而且数据传进来的是后面的name case .Property(_, _): if let cls = plugin as? XWVScripting.Type { if let isExcluded = cls.isKeyExcluded(fromScript:), name.withCString(isExcluded) { return true } if let scriptNameForKey = cls.scriptName(forKey:) { name = name.withCString(scriptNameForKey) ?? name } } else if name.first == "_" { return true } 但是我测试的代码,单独写的时候,发现let isExcluded = cls.isKeyExcluded(fromScript:),并不会进入isKeyExcluded方法内; 甚是奇怪,奇怪
iamnobody 2019-05-15
  • 打赏
  • 举报
回复
忘了,调用函数时,其实也存在 String 到 UnsafePointer<Int8> 的转换,
所以调用方法是这样的:


isKeyExcluded( fromScript:"a string")
iamnobody 2019-05-15
  • 打赏
  • 举报
回复
withCString 接受的是一个函数类型的参数。用法如下:

"a string".withCString { p in
print(p.pointee)
}


另外,利用 [Int8]到 UnsafePointer<Int8> 的隐式转换,也可以这样写

isKeyExcluded( fromScript:"a string".cString(using: .utf8))
iamnobody 2019-05-15
  • 打赏
  • 举报
回复
刚刚注意到,是我搞错了,不好意思,他这里的isExcluded 不是一个Bool 类型,是一个 (UnsafePointer<Int8>)->Bool 类型的函数变量。
所以他是可以传给withCString的
iamnobody 2019-05-15
  • 打赏
  • 举报
回复
这代码确实是错的,可能因为什么bug,导致显示的不对或者是编译器没有检测出来。

let b = "x".withCString() { p in
return true
}

这样的写法才是对的, 这时 b == true

muyu114 2019-05-15
  • 打赏
  • 举报
回复
引用 6 楼 iamnobody 的回复:
你这个测试1的代码应该是错的呀。。。你截图看看源码是什么样的吧
源码就是这样 错误测试代码: 你可以看直接砍下这个源码: https://github.com/XWebView/XWebView https://github.com/XWebView/Sample
iamnobody 2019-05-15
  • 打赏
  • 举报
回复
你这个测试1的代码应该是错的呀。。。你截图看看源码是什么样的吧
muyu114 2019-05-15
  • 打赏
  • 举报
回复
具体的代码,可以看下这个库xwebview的XWVMetaObject
muyu114 2019-05-15
  • 打赏
  • 举报
回复
引用 3 楼 iamnobody 的回复:
忘了,调用函数时,其实也存在 String 到 UnsafePointer<Int8> 的转换, 所以调用方法是这样的:

isKeyExcluded( fromScript:"a string") 
大虾所说的单独调用理解,但是这个地方的使用有点不太明白: 测试1: if let isExcluded = cls.isKeyExcluded(fromScript:), name.withCString(isExcluded) { return true } 测试1正常使用,这个方法始终没有想明白,前面的参数传入的是哪个,我调试的时候发现isKeyExcluded用的貌似是name;还有后面的withCString怎么能使用一个bool的返回值(单独使用报错);
muyu114 2019-05-14
  • 打赏
  • 举报
回复
顶起顶起顶起顶起

1,420

社区成员

发帖
与我相关
我的任务
社区描述
Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于MAC OS和iOS平台,用于搭建基于苹果平台的应用程序。
swift 技术论坛(原bbs)
社区管理员
  • Swift
  • 网罗开发
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧