在"The Swift Programming Language"一书(第599页)中,我遇到了这段令我困惑的代码片段.它是这样的:
func buyFavoriteSnack(person:String) throws {
let snackName = favoriteSnacks[person] ?? "Candy Bar"
try vend(itemName:snackName)
}
Run Code Online (Sandbox Code Playgroud)
它的解释是:
buyFavoriteSnack(_ :)函数查找给定人最喜欢的零食,并尝试为他们购买.如果他们没有列出最喜欢的零食,它会尝试买一个糖果棒.如果他们...
这个解释如何映射到"??" 给定代码中的运算符.什么时候应该/我们可以在自己的代码中使用这种语法吗?
考虑这个myFilter函数,它接受泛型参数并根据谓词过滤数组.这与filter()Swift提供的功能相同.
func myFilter<T>(source: [T], predicate:(T) -> Bool) -> [T] {
var result = [T]()
for i in source {
if predicate(i) {
result.append(i)
}
}
return result
}
Run Code Online (Sandbox Code Playgroud)
这有什么不同,
func myFilter(source: [AnyObject], predicate:(AnyObject) -> Bool) -> [AnyObject] {
var result = [AnyObject]()
for i in source {
if predicate(i) {
result.append(i)
}
}
return result
}
Run Code Online (Sandbox Code Playgroud)
即使在后一个例子中,我们也不是达到了泛型的地步吗?
Swift是否提供本地设计合同支持?我知道它可以在运行时通过断言完成,但它可以在编译期间完成吗?或者,有没有外部插件/库这样做?
编辑
通过说"在编译期间按合同设计",我并不是说库是C#所有功能强大的静态分析器.如果它类似于iContract为Java提供的东西,那对我来说已经足够了.我们来看一个例子:
使用iContract在Java中进行平方根评估的DBC代码可以写成:
/**
* @pre f >= 0.0
* @post Math.abs((return * return) - f) < 0.001
*/
public float sqrt(float f) { ... }
Run Code Online (Sandbox Code Playgroud)
现在,这使我的合同成为我的API规范的一部分而不是其实现的一部分,我认为这是一种更清洁的方式.呼叫者将知道他的职责是什么,被呼叫者正在设定其期望,所有这些都是更清晰的方式.我们在Swift中有这样的东西吗?
我正在尝试创建一个包装器Retrofit来抽象我的服务实现.到目前为止,我已经成功编译了编译器:
package com.example.spark.testapp.services;
import com.example.spark.testapp.services.apis.Get;
import com.example.spark.testapp.services.apis.Post;
import com.example.spark.testapp.services.utils.*;
import com.example.spark.testapp.services.utils.Error;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class ServiceLayer {
public <T> void performGet(String url, final Class<Get<T>> clazz, com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Get<T> service = retrofit.create(clazz);
//Pass authentication token here
Call<T> t = service.get(url, "");
executeCallback(callback,t);
}
public <T> void performPost(String url, final Class<Post<T>> clazz,com.example.spark.testapp.services.utils.Callback<T> callback) {
Retrofit retrofit = new Retrofit.Builder().baseUrl("").build();
Post<T> service = retrofit.create(clazz);
//Pass authentication token …Run Code Online (Sandbox Code Playgroud) 我有一个XCTestCase看起来像这样的子类.我已删除setup(),并tearDown为简洁的方法:
class ViewControllerTests <T : UIViewController>: XCTestCase {
var viewController : T!
final func loadControllerWithNibName(string:String) {
viewController = T(nibName: string, bundle: NSBundle(forClass: ViewControllerTests.self))
if #available(iOS 9.0, *) {
viewController.loadViewIfNeeded()
} else {
viewController.view.alpha = 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
它的子类看起来像这样:
class WelcomeViewControllerTests : ViewControllerTests<WelcomeViewController> {
override func setUp() {
super.setUp()
self.loadControllerWithNibName("welcomeViewController")
// Put setup code here. This method is called before the invocation of each test method in the class.
}
func testName() {
let …Run Code Online (Sandbox Code Playgroud) 我在Java中学习了多线程的概念,在那里我遇到了这个非常有趣的行为.我正在尝试各种创建线程的方法.现在问的是我们在扩展a Thread而不是实现Runnable接口的时候.
在旁注中,我知道它实现Runnable接口而不是扩展Thread类是完美的OO意义,但是出于这个问题的目的,让我们说我们扩展了Thread类.
让t我的扩展Thread类的实例,我有一个代码块在后台执行,写在我run()的Thread类的方法中.
它完全在后台运行t.start(),但我有点好奇并称之为t.run()方法.在主线程中执行的代码片段!
t.start()那t.run()不是做什么的?
我正在通过Haskell学习Swift中的函数式编程,并遇到了这个有趣的Transducers概念.一个代码示例实现了一个mapping基本上吐出传感器的函数,因为我们将转换规则作为参数传递.
灵感,我很快将其翻译成Swift等价物,这就是我得到的:
func mapping < A, B, C> (f: A -> B) -> ( ( (C,B) -> C) -> ( (C,A) -> C) ) {
return { r in
return { result, a in
return r(result,f(a))
}
}
}
Run Code Online (Sandbox Code Playgroud)
我现在的问题是注意转换函数如何从A转到B((A -> B)),但是转换器从B转到A(( (C,B) -> C) -> ( (C,A) -> C))?这是为什么?我确信这不是巧合,因为这个顺序很重要.哈斯克尔专家,有人吗?
我有一个协议及其相应的扩展,看起来像这样:
import Foundation
protocol HelpActionManageable {
typealias ItemType : UIViewController,HelpViewControllerDelegate
var viewController : ItemType {
get
}
}
extension HelpActionManageable {
func presentHelpViewController() {
let helpViewController = HelpViewController(nibName: HelpViewController.nibName(), bundle: nil)
viewController.presentViewController(helpViewController, animated: true, completion:nil)
helpViewController.delegate = viewController
}
func dismissSuccessfulHelpViewController(helpViewController:HelpViewController) {
helpViewController.dismissViewControllerAnimated(true) { () -> Void in
self.viewController.showAlertControllerWithTitle(GlobalConstants.Strings.SUCCESS, message: GlobalConstants.Strings.VALUABLE_FEEDBACK, actions: [], dismissingActionTitle: GlobalConstants.Strings.OK, dismissBlock: nil)
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以,在随机视图控制器中确认了这个协议,我做的是这样的:
class RandomViewController : UIViewController, HelpViewControllerDelegate,HelpActionManageable {
//HelpViewControllerDelegate methods...
var viewController : RandomViewController {
return self
}
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但如果扩展HelpActionManageable …
我在 Swift 中探索发现它fatalError有这个签名:
@noreturn public func fatalError(@autoclosure message: () -> String = default, file: StaticString = #file, line: UInt = #line)
Run Code Online (Sandbox Code Playgroud)
为什么这样定义这个函数有什么具体原因吗?出什么问题了 :
@noreturn public func fatalError(message:String = default, file: StaticString = #file, line: UInt = #line) {
//Termination code
}
Run Code Online (Sandbox Code Playgroud)
请注意,我了解@autoclosure其工作原理,并且这个问题与它的用法无关;但关于可以使用这种模式的用例。
在我正在编写的 Android 应用程序中,我有一个文档图像 ( jpeg ),该图像正在上传到识别该文档并向我发送回相关详细信息的服务器。虽然一切都很好,但服务器中的代码希望我设置“图像 DPI”元信息,如 mac 中所示,

上面的屏幕截图中显示的“图像 DPI”并不完全是它的值。我写了一个计算 dpi 值的方法。如何将如此计算的 dpi 值设置为jpeg的元信息?我已经能够在应用程序的 iOS 版本中设置这个特定的元信息,但在 Android 中,两天的不懈尝试让我的任务徒劳无功。
我确实知道ExifInterface,但我很不幸地使用了它的setAttribute(String key,String value)方法。(键应该是什么?值应该是什么?如何设置单位?我应该设置单位吗?)。
我还看到了与 Java 相关的解决方案,建议使用javax.imageio.*Android 根本不可用的包。
有人遇到过这样的问题吗?我该如何继续讨论这个问题?
我正在使用 J 编程语言,我尝试创建一个动词,用于从概率列表中计算熵(事件的结果,公式在 python/pesudocode: 中是这样的-sum([p*log(p,2) for p in ps]))。
我尝试使用组合 ( @:)的版本有效,但基于hook & fork 的版本似乎在做其他事情,我关心它为什么这样做。我正在尝试使用hook和fork 进行工作,这个案例确实证明我的直觉是错误的。
这是代码:
probs =: 0.75 0.25 NB. probabilties
entropy =: +/ @: (- * 2&^.)
entropyWrong =: +/ (- * 2&^.)
entropy probs NB. this is correct
0.811278
entropyWrong probs NB. this is wrong!
1.06128 1.25
0.561278 0.75
NB. shouldn't the following be the same as above (wrong)?
+/ (- * 2&^.) probs
0.811278 …Run Code Online (Sandbox Code Playgroud)