相关疑难解决方法(0)

字符串值为UnsafePointer <UInt8>函数参数行为

我发现以下代码编译和工作:

func foo(p:UnsafePointer<UInt8>) {
    var p = p
    for p; p.memory != 0; p++ {
        print(String(format:"%2X", p.memory))
    }
}

let str:String = "??"
foo(str)
Run Code Online (Sandbox Code Playgroud)

这打印E4BB8AE697A5,这是一个有效的UTF8表示??

据我所知,这是无证行为.来自文件:

当函数声明为采用UnsafePointer参数时,它可以接受以下任何一种:

  • nil,作为空指针传递
  • UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要时转换为UnsafePointer
  • 一个输入输出表达式,其操作数是类型为Type的左值,它作为左值的地址传递
  • 一个[Type]值,作为指向数组开头的指针传递,并在调用期间延长生命周期

在这种情况下,str不属于他们.

我错过了什么吗?


添加:

如果参数类型是,则它不起作用 UnsafePointer<UInt16>

func foo(p:UnsafePointer<UInt16>) {
    var p = p
    for p; p.memory != 0; p++ {
        print(String(format:"%4X", p.memory))
    }
}
let str:String = "??"
foo(str)
//  ^ 'String' is not convertible to 'UnsafePointer<UInt16>'
Run Code Online (Sandbox Code Playgroud)

即使内部String表示是UTF16

let str = "??" …
Run Code Online (Sandbox Code Playgroud)

swift

12
推荐指数
1
解决办法
5620
查看次数

类型'Boolean'不符合协议'BooleanType'

在尝试根据Apple文档(和教程化)创建启动助手时,我似乎遇到了将Objective-C代码移植到Swift中导致的打嗝...谁的编译器在这方面不再多余案件.

import ServiceManagement

let launchDaemon: CFStringRef = "com.example.ApplicationLauncher"

if SMLoginItemSetEnabled(launchDaemon, true) // Error appears here
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

错误似乎一直是:

Type 'Boolean' does not conform to protocol 'BooleanType'

我曾尝试Bool在很多地方进行投射,以防我只是处理冗余的,古老的原语(由Obj-C或Core Foundation引入),但无济于事.

为了以防万一,我尝试了回复:

SMLoginItemSetEnabled(launchDaemon, true) as Bool

产生错误:

'Boolean' is not convertible to 'Bool'

......当真?

xcode objective-c swift osx-yosemite

10
推荐指数
1
解决办法
5263
查看次数

打开本地商品钥匙扣?

有谁知道如何打开本地物品钥匙串(小牛队的新功能)SecKeychainOpen?该钥匙串中有某些条目,我希望能够要求用户使用该权限进行访问SecKeychainFindInternetPassword.

例如,您拨打的系统钥匙串SecKeychainOpen ("/Library/Keychains/System.keychain",&keychainRef).

c++ macos keychain

6
推荐指数
0
解决办法
593
查看次数

标签 统计

swift ×2

c++ ×1

keychain ×1

macos ×1

objective-c ×1

osx-yosemite ×1

xcode ×1