2016-05-26 37 views
1

我在Objective-C的一個框架,這個結構:轉換或比較「非託管<NSString>和NSString的

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; 

好了,現在我想在我的proyect拿到車的價值使用迅速

let carValueSwift = String(Vehicle.CAR) 

控制檯

"Unmanaged NSString(_value: CAR)"

我該如何解決這個問題?我需要像NSString這樣的值,因爲如果那麼我想在我的框架中比較:

["CAR" isEqual: carValueSwift]沒有用。

非常感謝您

+0

任何原因,你正在使用'__unsafe_unretained',而不是'weak' ? – JAL

+0

__weak給出下一個錯誤:ARC禁止在struct – Patrick

+2

中使用Objective-C對象當然,你不能在結構中使用'weak'。 – JAL

回答

0

隨着takeUnretainedValue()Unmanaged<NSString>轉換 到NSString(沒有取得所有權),這可以簡單地 投給斯威夫特String

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

好的答案;)謝謝 – Patrick

0

好吧,我發現的解決方案:

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:方法,請,讓我知道...