我尝试了解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 …
在我的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) 在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现在支持泛型类型.
我创建了一个示例项目和旁边的框架.该框架称为"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的错误消息:
为运营商找到不明确的运营商声明.运算符不是已知的二元运算符
在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)
但是编译器给出了错误:"带有约束的类型数组的扩展不能有继承子句"
那么还有其他方法可以实现这种行为吗?
我尝试尝试最近在 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 的最新开发?
这是我想要实现的目标:
我有一个通用结构struct Future<Element> {}和另一个通用结构Response<T> {}.我想写这是在扩展的方法Future是,只有当有效Element的Response<T>.什么T是无关紧要的.所以这是代码:
extension Future where Element == Response { }
但swift编译器抱怨引用泛型类型'Response'需要<...>中的参数.还有另一种方法可以迅速实现这一目标吗?
我想知道我们可以在swift中实现强类型选择器吗?例如,如果我buttonTapped(sender: AnyObject)稍后在我的视图控制器中有一个方法,当我们将该方法作为目标添加到某个按钮时,我们可以说
button.addTarget(self, selector:ViewController.buttonTapped(self), forControlEvents: .TouchUpInside)
Run Code Online (Sandbox Code Playgroud) 所以我在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.
那么这种尝试捕获的东西在这些情况下是如何工作的呢?
我正在构建一个动态框架。我的框架与几个静态库链接。当它在带有示例应用程序的模拟器中运行时,它工作正常。但是当我尝试使用示例应用程序对其进行存档时,我从链接器中收到以下错误。
Undefined symbols for architecture arm64:
"__mh_execute_header", referenced from:
Run Code Online (Sandbox Code Playgroud)
那么它是什么__mh_execute_header以及它是在什么框架/库中定义的?
我正在尝试实现功能组合.起初我定义了一个名为的函数compose.
func compose<A,B,C>(f:(B -> C))(g: (A -> B)) -> A -> C {
return { f(g($0)) }
}
Run Code Online (Sandbox Code Playgroud)
这非常有效.例如,如果我有not和isEven功能像
func not(value: Bool) -> Bool {
return !value
}
func even(value: Int) -> Bool {
return value % 2 == 0
}
Run Code Online (Sandbox Code Playgroud)
该odd功能可以来定义not和even这样的:
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) 好吧,这是一个很长的标题.当我使用谷歌地图iOS sdk时我遇到了麻烦.我想显示一个关于用户点击的标记的信息窗口.根据文档,如果选择了GMSMarker的片段和标题属性,则当用户点击该标记时将显示信息窗口.但我也从GMSMapViewDelegate协议实现了mapView:didTapMarker:方法.如果我注释掉方法信息窗口是可见的,否则信息窗口不可见.那么当该方法实现时,如何显示信息窗口?