标签: optional

Swift 3可选的转义闭包参数

鉴于:

typealias Action = () -> ()

var action: Action = { }

func doStuff(stuff: String, completion: @escaping Action) {
    print(stuff)
    action = completion
    completion()
}

func doStuffAgain() {
    print("again")
    action()
}

doStuff(stuff: "do stuff") { 
    print("swift 3!")
}

doStuffAgain()
Run Code Online (Sandbox Code Playgroud)

有没有办法制作类型的completion参数(和action)Action?并保持@escaping

更改类型会出现以下错误:

error: @escaping attribute only applies to function types

删除@escaping属性,代码编译并运行,但似乎不正确,因为completion闭包正在逃避函数的范围.

closures function optional swift3

148
推荐指数
5
解决办法
5万
查看次数

Java 8 - Optional.flatmap和Optional.map之间的区别

这两种方法有什么区别:Optional.flatMap()Optional.map()

一个例子将不胜感激.

java optional java-8

136
推荐指数
6
解决办法
7万
查看次数

为Swift中的Optional提供默认值?

在Swift中处理选项的习惯用法似乎过于冗长,如果你想做的就是在nil的情况下提供一个默认值:

if let value = optionalValue {
    // do something with 'value'
} else {
    // do the same thing with your default value
}
Run Code Online (Sandbox Code Playgroud)

这涉及不必要地复制代码,或

var unwrappedValue
if let value = optionalValue {
    unwrappedValue = value
} else {
    unwrappedValue = defaultValue
}
Run Code Online (Sandbox Code Playgroud)

unwrappedValue不一定是常数.

Scala的Option monad(与Swift的Optional基本相同)具有getOrElse用于此目的的方法:

val myValue = optionalValue.getOrElse(defaultValue)
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?斯威夫特有一个紧凑的方式吗?或者,如果失败,是否可以getOrElse在可选的扩展中定义?

optional swift

133
推荐指数
3
解决办法
6万
查看次数

在Swift中的if语句中使用多个let-as

我正在从字典中解开两个值,在使用它们之前我必须将它们转换为正确的类型.这就是我想出的:

var latitude : AnyObject! = imageDictionary["latitude"]
var longitude : AnyObject! = imageDictionary["longitude"]

if let latitudeDouble = latitude as? Double  {
   if let longitudeDouble = longitude as? Double {
       // do stuff here
   }
}
Run Code Online (Sandbox Code Playgroud)

但是如果让查询合二为一,我想打包两个.所以它会是这样的:

if let latitudeDouble = latitude as? Double, longitudeDouble = longitude as? Double {
    // do stuff here
}
Run Code Online (Sandbox Code Playgroud)

那句法不起作用,所以我想知道是否有一种漂亮的方法可以做到这一点.

if-statement optional swift

132
推荐指数
3
解决办法
6万
查看次数

可选orElse Java中的可选项

我一直在使用Java 8中的新Optional类型,我遇到了似乎是功能上不支持的常见操作:"orElseOptional"

考虑以下模式:

Optional<Result> resultFromServiceA = serviceA(args);
if (resultFromServiceA.isPresent) return result;
else {
    Optional<Result> resultFromServiceB = serviceB(args);
    if (resultFromServiceB.isPresent) return resultFromServiceB;
    else return serviceC(args);
}
Run Code Online (Sandbox Code Playgroud)

这种模式有很多种形式,但归结为在一个可选项上需要一个"orElse",它接受一个生成一个新的可选项的函数,只有当前的一个不存在时才被调用.

它的实现看起来像这样:

public Optional<T> orElse(Supplier<Optional<? extends T>> otherSupplier) {
    return value != null ? this : other.get();
}
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有这样的方法不存在的原因,如果我只是以一种无意的方式使用Optional,以及人们提出了处理这种情况的其他方式.

我应该说,我认为涉及自定义实用程序类/方法的解决方案并不优雅,因为使用我的代码的人不一定知道它们存在.

另外,如果有人知道,这样的方法是否会包含在JDK 9中,我可以在哪里提出这样的方法?对我来说,这似乎是对API的一个相当明显的遗漏.

java lambda optional java-8 java-9

128
推荐指数
5
解决办法
7万
查看次数

Swift:测试nil的选项

我正在使用Xcode 6 Beta 4.我有这种奇怪的情况,我无法弄清楚如何适当地测试选项.

如果我有一个可选的xyz,是正确的测试方法:

if (xyz) // Do something
Run Code Online (Sandbox Code Playgroud)

要么

if (xyz != nil) // Do something
Run Code Online (Sandbox Code Playgroud)

文档说这是第一种方式,但我发现有时,第二种方式是必需的,并且不会产生编译器错误,但有时,第二种方式会产生编译器错误.

我的具体示例是使用桥接到swift的GData XML解析器:

let xml = GDataXMLDocument(
    XMLString: responseBody,
    options: 0,
    error: &xmlError);

if (xmlError != nil)
Run Code Online (Sandbox Code Playgroud)

在这里,如果我刚刚做了:

if xmlError
Run Code Online (Sandbox Code Playgroud)

它总会回归真实.但是,如果我这样做:

if (xmlError != nil)
Run Code Online (Sandbox Code Playgroud)

然后它工作(如在Objective-C中如何工作).

是否存在GData XML以及它对待我缺少的选项的方式?

optional ios swift

125
推荐指数
9
解决办法
15万
查看次数

检查字符串是否为空并且为空

有没有一种方法来检查字符串nil""斯威夫特?在Rails中,我可以blank()用来检查.

我目前有这个,但它似乎有点矫枉过正:

    if stringA? != nil {
        if !stringA!.isEmpty {
            ...blah blah
        }
    }
Run Code Online (Sandbox Code Playgroud)

string optional is-empty swift

120
推荐指数
9
解决办法
9万
查看次数

斯威夫特:守卫vs如果让

我一直在阅读关于Swift中的Optionals,我已经看过if let用于检查Optional是否包含值的示例,以及它是否存在 - 使用unwrapped值执行某些操作.

但是,我已经看到在Swift 2.0中,关键字guard主要用于.我想知道是否if let已从Swift 2.0中删除或是否仍然可以使用它.

我应该改变我的计划包含if letguard

conventions optional control-flow swift swift2

105
推荐指数
8
解决办法
4万
查看次数

Swift变量装饰用"?" (问号)和"!" (感叹号)

我知道在Swift中所有变量都必须设置一个值,并且通过使用选项,我们可以设置一个nil最初设置的变量.

我不明白的是,用a设置一个变量!是做什么的,因为我认为这会从一个可选项中"解开"一个值.我想通过这样做,你保证有一个值来展开该变量,这就是为什么在IBActions上你会看到它被使用.

所以简单地说,当你做这样的事情时,初始化的变量是什么:

var aShape : CAShapeLayer!
Run Code Online (Sandbox Code Playgroud)

为什么/我什么时候会这样做?

optional swift

103
推荐指数
1
解决办法
2万
查看次数

为什么java.util.Optional不是Serializable,如何使用这些字段序列化对象

Enum类是Serializable,因此使用枚举序列化对象没有问题.另一种情况是class具有java.util.Optional类的字段.在这种情况下,抛出以下异常:java.io.NotSerializableException:java.util.Optional

如何处理这些类,如何序列化它们?是否可以将此类对象发送到远程EJB或通过RMI?

这是一个例子:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Optional;

import org.junit.Test;

public class SerializationTest {

    static class My implements Serializable {

        private static final long serialVersionUID = 1L;
        Optional<Integer> value = Optional.empty();

        public void setValue(Integer i) {
            this.i = Optional.of(i);
        }

        public Optional<Integer> getValue() {
            return value;
        }
    }

    //java.io.NotSerializableException is thrown

    @Test
    public void serialize() {
        My my = new My();
        byte[] bytes = toBytes(my);
    }

    public static <T extends Serializable> byte[] toBytes(T reportInfo) { …
Run Code Online (Sandbox Code Playgroud)

java serialization optional java-8

101
推荐指数
4
解决办法
3万
查看次数