小编Jos*_*oid的帖子

我如何遵守与演员的协议?

当我尝试定义actor符合 a 的an 时protocol,Xcode 给出错误Actor-isolated instance method 'foo()' cannot be used to satisfy nonisolated protocol requirementnonisolated我可以实现我认为我不想做的功能。我需要吗?如果我这样做的话我会失去什么?

这是导致错误的示例代码:

protocol Fooable {
    func foo() -> Int
}

actor Bar: Fooable { // Error: Actor-isolated instance method...
    func foo() -> Int {
        return 42
    }
}
Run Code Online (Sandbox Code Playgroud)

actor swift swift-protocols

14
推荐指数
1
解决办法
6888
查看次数

发布Facebook Open Graph故事时如何选择一对多?

我成功地使用FBSDKShareOpenGraphObject,FBSDKShareOpenGraphAction,FBSDKShareOpenGraphContent[FBSDKShareAPI shareWithContent:...]iOS上创建和分享一个故事.股票项目总是发布为"Josh Paradroid在app中走了一米".我想要的是能够发布"Josh Paradroid在app中走了500米".我的复数似乎都在故事中正确设置,但我如何选择使用"一对多"版本并提供代码中的米数?

非常感谢.

objective-c facebook-graph-api ios facebook-ios-sdk

7
推荐指数
1
解决办法
219
查看次数

Xcode 8说"你想添加一个存根吗?" 我该怎么回答?

在Xcode 8中,如果你声明一个类(或结构)符合协议,但没有实现所需的方法(函数?),Xcode将给出这个消息"类型' ClassName'不符合协议' ProtocolName'"这是真正.

如果通过单击显示三角形打开错误,您将看到许多带有灰色感叹号图标的项目.每个项目都说"协议需要功能......你想添加一个存根吗?" 我确实想添加一个存根!我怎么告诉它为我添加一个存根?

xcode8

7
推荐指数
1
解决办法
3087
查看次数

如何检测 Firebase 存储文件是否存在?

我正在编写一个 Swift 扩展FIRStorageReference来检测文件是否存在。我在打电话metadataWithCompletion()。如果NSError未设置完成块的 optional ,我认为可以安全地假设该文件存在。

如果设置了 NSError,要么出现问题,要么文件不存在。关于在 iOS 中处理错误存储文档指出这FIRStorageErrorCodeObjectNotFound是我应该检查的错误类型,但没有解决(可能 Swiftified 为更短的 .Name 样式常量?)而且我不确定我应该是什么检查它。

completion(nil, false)如果FIRStorageErrorCodeObjectNotFound设置在某处,我想打电话。

到目前为止,这是我的代码。

extension FIRStorageReference {
    func exists(completion: (NSError?, Bool?) -> ()) {
        metadataWithCompletion() { metadata, error in
            if let error = error {
                print("Error: \(error.localizedDescription)")
                print("Error.code: \(error.code)")

                // This is where I'd expect to be checking something.

                completion(error, nil)
                return
            } else {
                completion(nil, true)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

提前谢谢了。

ios swift firebase-storage

5
推荐指数
1
解决办法
4648
查看次数

初始化器要求 'init(json:)' 只能通过非最终类 'UIColor' 定义中的“必需”初始化器来满足

我正在尝试编写一个扩展来满足扩展中的协议,如下所示:

extension UIColor: JSONRepresentable {
    convenience init?(json: Any) {
        guard let colourArray = json as? [CGFloat] else {
            print("json was not an array of CGFloats")
            return nil
        }
    
        self.init(
            red: colourArray[0],
            green: colourArray[1],
            blue: colourArray[2],
            alpha: colourArray[3]
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Initializer requirement 'init(json:)' can only be satisfied by a required initializer in the definition of non-final class 'UIColor'.
Run Code Online (Sandbox Code Playgroud)

如果我添加required关键字,则会收到此错误

'required' initializer must be declared directly in class 'UIColor' (not in an extension).
Run Code Online (Sandbox Code Playgroud)

是否有原因或任何解决方法?

编辑:为了清楚起见,这是协议

protocol JSONRepresentable …
Run Code Online (Sandbox Code Playgroud)

protocols swift

5
推荐指数
1
解决办法
3665
查看次数

如何获取我正在使用 XCTAssertNoThrow(...) 测试的可以抛出的函数的返回值

我想获取我正在为后续测试测试的函数的返回值。函数定义如下:

func apple(banana: Banana) throws -> Cherry { ... }

我可以测试它应该在什么时候抛出:

XCTAssertThrowsError(try apple(banana: badBanana), "Didn't throw")

我可以测试它在不应该抛出时不会抛出:

XCTAssertNoThrow(try apple(banana: goodBanana), "Did throw")

我希望这样做:

XCTAssertNoThrow(let cherry = try apple(banana: goodBanana), "Did throw")

然后检查cherry是我所期望的,但我收到以下错误:Consecutive statements on a line must be separated by ';'...

如何CherryXCTAssertNoThrow测试中获取返回值(在本例中为类型对象)?或者有没有更好的方法我错过了?

非常感谢

unit-testing assert xctest

5
推荐指数
3
解决办法
1050
查看次数

如何与合并运算符一起使用try?

我正在尝试x从一个带有f一个参数(字符串)并抛出的函数分配一个值。

当前范围抛出了,所以我相信do... catch不是必需的。

我正在尝试try与合并运算符一起使用,??但出现此错误:'try' cannot appear to the right of a non-assignment operator

guard let x = try f("a") ??
              try f("b") ??
              try f("c") else {
    print("Couldn't get a valid value for x")
    return
}
Run Code Online (Sandbox Code Playgroud)

如果我更改trytry?

guard let x = try? f("a") ??
              try? f("b") ??
              try? f("c") else {
    print("Couldn't get a valid value for x")
    return
}
Run Code Online (Sandbox Code Playgroud)

我得到警告Left side …

swift

5
推荐指数
1
解决办法
288
查看次数

奇怪的String.unicodeScalars和CharacterSet行为

我正在尝试使用Swift 3 CharacterSet来过滤字符,String但是我很早就陷入了困境.CharacterSet有一个名为的方法contains

func包含(_ member:UnicodeScalar) - > Bool
测试CharacterSet中特定UnicodeScalar的成员资格.

但测试这不会产生预期的行为.

let characterSet = CharacterSet.capitalizedLetters

let capitalAString = "A"

if let capitalA = capitalAString.unicodeScalars.first {
    print("Capital A is \(characterSet.contains(capitalA) ? "" : "not ")in the group of capital letters")
} else {
    print("Couldn't get the first element of capitalAString's unicode scalars")
}
Run Code Online (Sandbox Code Playgroud)

我已经到了Capital A is not in the group of capital letters,我期待相反的事情.

非常感谢.

swift

4
推荐指数
1
解决办法
491
查看次数

调用另外两个完成块时调用完成块

我有一个doEverything完成块的功能.它调用其他两个函数,doAlphadoBeta这两者都具有完成块.这两个函数应该异步运行.我想doEverything在两个其他函数调用完成块之后调用完成块.

目前,它看起来像这样:

func doEverything(completion: @escaping (success) -> ())) {
    var alphaSuccess = false
    var betaSuccess = false

    doAlpha { success in
        alphaSuccess = success
    }

    doBeta { success in
        betaSuccess = success
    }

    // We need to wait here
    completion(alphaSuccess && betaSuccess)
}
Run Code Online (Sandbox Code Playgroud)

doAlpha并且doBeta应该同时运行,并且一旦完成,就应该使用alpha和beta的结果调用完成块.

我已经阅读了调度组和障碍,但我不确定哪个是最合适的,它们如何引入新的范围(关于我正在使用的两个变量)以及我应该如何实现它.

非常感谢.

grand-central-dispatch swift swift3

3
推荐指数
1
解决办法
1529
查看次数

如何获取要删除的 Core Data 持久存储的 URL?

我想调用该函数persistentStoreCoordinator.destroyPersistentStoreAtURL(...)。我正在用它创建我的容器,就像这样NSPersistentContainer(name: "MyProject")我想知道的是如何获取 persistenceStore 的 URL 以在第一次调用中使用,最好是在 Swift 中。

非常感谢。

core-data ios

3
推荐指数
1
解决办法
1335
查看次数