2016-04-03 54 views
0

在java中8,你可以做到以下几点: -可以将swift optional映射到新值吗?

Optional<String> foo = Optional.empty(); // or Optional.of("hello"); 
foo.map(String::toUpperCase).orElse("Empty String") 

编辑 - 另一个例子

class Bar { 
    public Bar(final String baz) { ... } 
} 

foo.map(f -> new Bar(f)) // has mapped into an optional Bar 

这toUpperCase有点太简单;我想更像是能够指定一个lambda函数或函数,可以提供基于可选present的变异值。

我看你能在迅速以下几点: -

guard let foo = optional else { return "Empty String" } 

是大量有用的,也

optional ?? "Empty String" 

,但有什么办法来映射基于值的值是否存在?即如果存在一个值,您可以返回一个突变值?

此功能也可用于Java/C#集合

+0

也许给你的Java或C#实际上意味着什么是有帮助的。 “变异”在这里特别不明确。我相信你的意思是映射。 –

+0

增加了一个例子,但我没有意识到'$ 0'允许我获得可以传递到任何我需要的值 – chrisw

回答

3

说可选的字符串给定的数组,你可以使用可选链内的map操作

let foo: [String?] = ["foo", "bar", nil, "baz"] 

let bar = foo.map { $0?.uppercaseString ?? "Empty string" } 
print(bar) // ["FOO", "BAR", "Empty string", "BAZ"] 

甲可能更多有用的替代是应用flatMap操作简单地删除nil -valued从字符串数组可选条目

let foo: [String?] = ["foo", "bar", nil, "baz"] 

let bar = foo.flatMap { $0?.uppercaseString } 
print(bar) // ["FOO", "BAR", "BAZ"] 

W.r.t.你的评论,你可以例如在flatMap操作中调用一个failable初始值设定程序,例如某种结构Foo,假设初始化程序成功,将生成一个Foo实例的数组。

struct Foo { 
    let foo: String 
    init?(bar: String?) { 
     guard let foo = bar else { 
      return nil 
     } 
     self.foo = foo 
    } 
} 

let foo: [String?] = ["foo", "bar", nil, "baz"] 
let bar = foo.flatMap { Foo(bar: $0) } 
print(bar) // [Foo(foo: "foo"), Foo(foo: "bar"), Foo(foo: "baz")] 
+0

这看起来很接近,但我认为它是有限的使用操作符来选择调用uppercaseString,即我不能做一些更复杂的事情,比如我评论过Rob的回答? – chrisw

+0

看起来像我之后,$ 0被用作函数的参数,即类似于返回值的高阶函数。在这种情况下。你传递的值,如果存在,返回一个Foo实例。 – chrisw

+0

@chrisw'$ 0'是匿名(尾随)闭包的单个参数,用作'flatMap'操作的参数;在这种情况下,'flatMap'是一个高阶函数,它将闭包作为参数。作为参数“$ 0”参数的“给定”值是数组的元素(这里是“foo”)。 – dfri

1

在你的榜样,这只是:

optional?.uppercaseString ?? "EMPTY STRING" 

,或者如果你宁愿违约后修改:

(optional ?? "empty string").uppercaseString 

你脑海里有更复杂的东西吗?

(您可能不熟悉的?.运营商。这就是所谓的斯威夫特可选的链接,以及类似于map。)

+0

因此,也许我的例子有点太简化了,也许如果我进一步变异,即如果我有一个可选的元组,我想映射到一个对象。即(30,“克里斯托弗”),可以是一个Person结构,它需要年龄和名字。 – chrisw

+0

这里还不清楚你是否试图映射一个单独的元组或它们的集合。在这些情况下,“变异”的含义也不清楚。 –

+0

对不起,如果我问,我可以指定一个lambda函数或一个函数来将该值更改为从lambda返回的值,其中传递给它的参数是可选的现值 – chrisw

相关问题