【问题标题】:Convert or compare "Unmanaged<NSString> and NSString转换或比较“Unmanaged<NSString> 和 NSString
【发布时间】:2016-05-26 13:36:58
【问题描述】:

我有一个带有这个结构的 Objective-C 框架:

VehicleClass.h

struct VehicleStruct
{
    __unsafe_unretained NSString *const CAR;
    __unsafe_unretained NSString *const MOTORCYCLE;
    __unsafe_unretained NSString *const TRUCK;
};

VehicleClass.m

#import "VehicleClass.h"

const struct VehicleStruct Vehicle = {
    .CAR = @"CAR",
    .MOTORCYCLE = @"MOTORCYCLE",
    .TRUCK = @"TRUCK"
};

在我的 Contansts.h

extern const struct VehicleStruct Vehicle;

好吧,现在我想在我的项目中使用 swift 获得汽车价值:

let carValueSwift = String(Vehicle.CAR)

控制台中:

“非托管 NSString(_value: CAR)”

我该如何解决这个问题?我需要像 NSString 一样获取这个值,因为如果那时我想在我的框架中进行比较:

["CAR" isEqual: carValueSwift] 不起作用。

非常感谢

【问题讨论】:

  • 您为什么使用__unsafe_unretained而不是weak
  • __weak 给出下一个错误:ARC forbids Objective-C objects in struct
  • 啊,当然,你不能在结构中使用weak

标签: objective-c swift struct


【解决方案1】:

使用takeUnretainedValue() 转换Unmanaged&lt;NSString&gt;NSString(不取得所有权),这可以简单地 转换为 Swift String:

let carValueSwift = Vehicle.CAR.takeUnretainedValue() as String
print(carValueSwift)

【讨论】:

  • 好答案 ;) 谢谢
【解决方案2】:

嗯,我找到了解决方案:

let car: Unmanaged<NSString> = Vehicle.CAR

let carString = convertCfTypeToString(car)

功能:

func convertCfTypeToString(cfValue: Unmanaged<NSString>!) -> String?
{
   let value = Unmanaged.fromOpaque(
       cfValue.toOpaque()).takeUnretainedValue() as CFStringRef
   if CFGetTypeID(value) == CFStringGetTypeID(){
       return value as String
   } else {
       return nil
   }
}

如果有人知道其他避免使用convertCfTypeToString: 方法的方法,请告诉我...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多