【问题标题】:Implicitly construct NSString with std::string用 std::string 隐式构造 NSString
【发布时间】:2014-04-22 18:42:27
【问题描述】:

在使用 Objective-C++ 时,我经常发现自己使用 initWithCString 将 std::string 转换为 NSString。为了简化流程,我在 NSString 上创建了一个类别,如下所示:

@implementation NSString (NSStringFromCPP)

+(NSString*)stringFromCppString:(std::string)cppString
{
    return [[NSString alloc] initWithCString:cppString.c_str() encoding:NSStringEncodingConversionAllowLossy];
}


-(std::string)cppString
{
    return std::string([self cStringUsingEncoding:NSStringEncodingConversionAllowLossy]);
}

@end

这使得 NSString 和 std::string 在两个方向上的转换变得相当容易。不过,似乎必须有一种方法可以将 std::string 隐式转换为 NSString 。我知道在Objective-C中没有构造函数之类的东西,那么如何在不必使用stringFromCppString

的情况下完成以下操作
-(void)something:(NSString*)someString
{
    NSLog(@"%@", someString);
}


-(void)activity
{
    std::string activityName = "Calculator";
    [self something:[NSString stringFromCppString:activityName]];
}

在大多数情况下,使用 std::string 的代码可以与使用 NSString 的代码分开。但是,会发生大量的桥接,并且代码变得分散注意力,到处都是stringFromCppString

【问题讨论】:

  • std::string s = ""; NSString *nsstr = @(s.c_str());

标签: c++ ios objective-c nsstring objective-c++


【解决方案1】:

您应该将 std::string const & 作为 Obj-C 方法中的参数类型传递。

+(NSString*)stringFromCppString:(std::string const &)cppString;

另外,不要忘记,当编译为 .mm 时,您可以使用普通的 C++,因此您可能需要考虑像重载这样简单的事情...

std::string
cppString(char const *s)
{
  return s;
}

std::string const &
cppString(std::string const &s)
{
  return s;
}

std::string
cppString(NSString *s)
{
  return [self cStringUsingEncoding:DESIRED_ENCODING];
}

反之……

NSString *
objcString(char const *s)
{
  return [NSString stringWithCString:s encoding:DESIRED_ENCODING];
}

NSString *
objcString(std::string const &s)
{
  return objcString(s.c_str());
}

NSString *
objcString(NSString *s)
{
  return s;
}

现在,当你想要一个 C++ std::string 时,只需调用 cppString 并且当你想要一个 Obj-C NSString 时,只需调用 objcString,你不必真正关心什么是“真实的”字符串是...

或者,您可以使用转换运算符制作自己的字符串包装器......这也很简单。

但是,一般来说,您可能希望您的 C++ 是 C++,而您的 ObjC 是 ObjC,并使用 .mm 作为轻量级粘合剂。

【讨论】:

    【解决方案2】:

    Objective-C 不提供任何类型之间隐式转换的工具。事实上,它甚至没有转换对象的概念——因为所有对象都由指针引用,所以转换只是不改变底层数据的指针转换。语言提供的将对象转换为其他类型的唯一方法是调用对象的方法。

    【讨论】:

      猜你喜欢
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2013-09-07
      相关资源
      最近更新 更多