小编mus*_*afa的帖子

Swift do-try-catch语法

我尝试了解swift 2中的新错误处理事情.这是我做的:我首先声明了一个错误枚举:

enum SandwichError: ErrorType {
    case NotMe
    case DoItYourself
}
Run Code Online (Sandbox Code Playgroud)

然后我宣布了一个抛出错误的方法(不是一个例外的人.这是一个错误.).这是方法:

func makeMeSandwich(names: [String: String]) throws -> String {
    guard let sandwich = names["sandwich"] else {
        throw SandwichError.NotMe
    }

    return sandwich
}
Run Code Online (Sandbox Code Playgroud)

问题来自呼叫方.以下是调用此方法的代码:

let kitchen = ["sandwich": "ready", "breakfeast": "not ready"]

do {
    let sandwich = try makeMeSandwich(kitchen)
    print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
    print("Not me error")
} catch SandwichError.DoItYourself {
    print("do it error")
}
Run Code Online (Sandbox Code Playgroud)

do行编译器说完之后Errors thrown from here are not handled because the enclosing …

swift swift2

157
推荐指数
2
解决办法
12万
查看次数

获得例外:"无法设置具有视图层次结构的布局,无法用于约束"

在我的storyboard应用程序中,我尝试添加额外UITextField的界面.但我得到标题所说的例外.我使用SwiftAutoLayout库.这是我的代码:

// MARK: - IBOutlets

@IBOutlet weak var passwordTextField: UITextField!

// MARK: - Properties

let userIdTextField = UITextField()

// MARK: - Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()

    self.passwordTextField.keyboardType = .NumberPad

    if getCurrentUserId() == nil {
        self.view.addSubview(userIdTextField)
        userIdTextField.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.view.addConstraints([userIdTextField.al_leading == passwordTextField.al_leading,
            userIdTextField.al_trailing == passwordTextField.al_trailing,
            userIdTextField.al_top == passwordTextField.al_bottom + 8])
        userIdTextField.placeholder = "Enter User Id..."
    }
}
Run Code Online (Sandbox Code Playgroud)

ios autolayout swift

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

Swift中的泛型类型

在haskell你可以这样做:

type Parser a = String -> [(a, String)]
Run Code Online (Sandbox Code Playgroud)

我试图在Swift中做类似的事情.到目前为止,我写的这些代码没有运气.

typealias Parser<A> = String -> [(A, String)]
typealias Parser a = String -> [(a, String)]
typealias Parser = String -> [(A, String)]
Run Code Online (Sandbox Code Playgroud)

那么这在快速中根本不可能吗?如果有其他方法来实现这种行为?

更新:似乎swift 3 https://github.com/apple/swift/blob/master/CHANGELOG.md现在支持泛型类型.

generics swift

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

Swift - 如何创建自定义运算符以在其他模块中使用?

我创建了一个示例项目和旁边的框架.该框架称为"SampleFramework".然后我在SampleFramework中创建了一个自定义运算符.这是它的样子:

infix operator >>= {associativity left}
public func >>=<A, B>(a: A?, f: A -> B?) -> B? {
    if let a = a { return f(a) }
    else { return .None }
}
Run Code Online (Sandbox Code Playgroud)

然后我想用它作为我的主要应用程序.我导入了SampleFramework我的源文件,然后我编写了这段代码来测试它:

NSURL(string: "www.google.com") >>= { println("\($0)") }
Run Code Online (Sandbox Code Playgroud)

它没有编译.这是Xcode的错误消息:

为运营商找到不明确的运营商声明.运算符不是已知的二元运算符

operators swift

28
推荐指数
2
解决办法
2067
查看次数

带约束的Array类型的扩展不能有继承子句 - swift 2

在swift 2中我想扩展Array类型.我有一个JSONDecodable协议.我想对编译器说的是符合Array协议,JSONDecodable如果元素Array也是JSONDecodable.这是代码:

public protocol JSONDecodable {
    static func createFromJSON(json: [String: AnyObject]) throws -> Self
}

extension Array: JSONDecodable where Element: JSONDecodable {

}
Run Code Online (Sandbox Code Playgroud)

但是编译器给出了错误:"带有约束的类型数组的扩展不能有继承子句"

那么还有其他方法可以实现这种行为吗?

arrays protocols swift

21
推荐指数
2
解决办法
2857
查看次数

用于开发快照的 Swift Package Manager 工具版本

我尝试尝试最近在 swift 5.3 中实现的 SPM 的一些新功能。像新的二进制依赖项和资源支持。为了测试这些新功能,我访问了 swift.org 并下载了最新的 swift 5.3 开发快照,目前是 2020 年 4 月 21 日。我安装了它并在 xcode 首选项中将其选为默认工具链。但是,当我使用 xcode 创建新包时,它说 swift-tools-version 是 5.2。我试着像这样设置它 5.3 // swift-tools-version:5.3。但是 xcode 说

package at ... is using Swift tools version 5.3.0 but the installed version is 5.2.0

所以我的问题是如何从开发快照中测试 spm 的最新开发?

xcode swift swift-package-manager

20
推荐指数
1
解决办法
2859
查看次数

带有泛型参数的Swift 3泛型扩展约束

这是我想要实现的目标:

我有一个通用结构struct Future<Element> {}和另一个通用结构Response<T> {}.我想写这是在扩展的方法Future是,只有当有效ElementResponse<T>.什么T是无关紧要的.所以这是代码:

extension Future where Element == Response { }

但swift编译器抱怨引用泛型类型'Response'需要<...>中的参数.还有另一种方法可以迅速实现这一目标吗?

generics swift

8
推荐指数
2
解决办法
1172
查看次数

swift中强类型的选择器

我想知道我们可以在swift中实现强类型选择器吗?例如,如果我buttonTapped(sender: AnyObject)稍后在我的视图控制器中有一个方法,当我们将该方法作为目标添加到某个按钮时,我们可以说

button.addTarget(self, selector:ViewController.buttonTapped(self), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud)

cocoa ios swift

7
推荐指数
2
解决办法
940
查看次数

swift 2中的异步错误处理

所以我在swift 2中尝试了错误处理的事情.但是我不确定的一件事是如何让它适用于异步回调函数.假设我从后端加载资源.我定义了我的错误类型,如下所示:

enum NetworkError: ErrorType {
    case NoConnection
    case InvalidJSON
    case NoSuccessCode(code: Int)
}
Run Code Online (Sandbox Code Playgroud)

我打算在出现问题时抛出其中一个案例.这是进行网络呼叫的功能:

func loadRequest<T: Decodable>(request: NSURLRequest, callback:T -> Void) throws {
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(request) { data, response, error in
        // Other code that parses json and at somewhere it throws
        throw NetworkError.NoConnection
    }
}
Run Code Online (Sandbox Code Playgroud)

但这里编译器给出错误:

无法dataTaskWithRequest使用类型的参数列表 调用(NSURLRequest, (_,_,_) throws) -> Void)

从这里可以看出,相同的闭包类型在声明时被视为不同的类型throws.

那么这种尝试捕获的东西在这些情况下是如何工作的呢?

swift

6
推荐指数
1
解决办法
1464
查看次数

“__mh_execute_header”的未定义符号

我正在构建一个动态框架。我的框架与几个静态库链接。当它在带有示例应用程序的模拟器中运行时,它工作正常。但是当我尝试使用示例应用程序对其进行存档时,我从链接器中收到以下错误。

Undefined symbols for architecture arm64:
  "__mh_execute_header", referenced from:
Run Code Online (Sandbox Code Playgroud)

那么它是什么__mh_execute_header以及它是在什么框架/库中定义的?

xcode cocoa ios

6
推荐指数
1
解决办法
3696
查看次数

Curried中缀运营商在swift中.可能吗?

我正在尝试实现功能组合.起初我定义了一个名为的函数compose.

func compose<A,B,C>(f:(B -> C))(g: (A -> B)) -> A -> C {
    return { f(g($0)) }
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.例如,如果我有notisEven功能像

func not(value: Bool) -> Bool {
    return !value
}

func even(value: Int) -> Bool {
    return value % 2 == 0
}
Run Code Online (Sandbox Code Playgroud)

odd功能可以来定义noteven这样的:

func odd(value: Int) -> Bool {
    return compose(not)(isEven)(value)
}
Run Code Online (Sandbox Code Playgroud)

然后我决定使用自定义运算符而不是compose函数.自定义运算符是...起初我只是复制了compose函数并将其名称更改为...这是它的样子:

infix operator .. { associativity left }
func …
Run Code Online (Sandbox Code Playgroud)

operator-overloading currying swift

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

在谷歌映射iOS sdk时显示信息窗口,同时实现mapView:didTapMarker:委托方法实现

好吧,这是一个很长的标题.当我使用谷歌地图iOS sdk时我遇到了麻烦.我想显示一个关于用户点击的标记的信息窗口.根据文档,如果选择了GMSMarker的片段和标题属性,则当用户点击该标记时将显示信息窗口.但我也从GMSMapViewDelegate协议实现了mapView:didTapMarker:方法.如果我注释掉方法信息窗口是可见的,否则信息窗口不可见.那么当该方法实现时,如何显示信息窗口?

ios google-maps-sdk-ios

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