最近我开始模仿我的应用程序比以往更加激烈,将代码片段分成框架或库.
我喜欢桌面Cocoa中"私有框架"的概念,即.应用程序包中包含的框架.从我的小经验来看,框架比简单的库更适合代码重用,因为框架可以包含它们自己的头文件.这使得为现有项目添加新框架变得更加容易.
问题是iOS上不支持这些"私有"框架.你必须在那里使用静态库,标题管理很痛苦.有没有一个很好的技术理由让Apple不支持iOS上的框架?
(只是为了确保:Apple不幸使用"私有框架"这两个术语.第一个是与应用程序一起提供的"自定义"框架,第二个是未记录的框架,人们不应该在iOS上使用这些框架.我问起前者.)
PS.这是iOS 8中的变化吗?Xcode 6中有一个"Cocoa Touch Framework"模板.
我在主应用程序菜单中有一个菜单项,我想将其动作路由到视图控制器(NSViewController).界面层次结构如下所示:有一个主应用程序窗口控制器NSWindowController.在窗口内部有一个分割视图,分割视图中的右视图由分割视图控制NSViewController.
Window + NSWindowController
`-- NSSplitView
`-- NSView
`-- NSView + NSViewController
Run Code Online (Sandbox Code Playgroud)
菜单项连接到Interface Builder中的First Responder.有问题的视图控制器实现了适当的方法,但菜单项保持禁用状态.当我将方法移动到NSWindowController,菜单项被启用.
我想我需要将视图控制器放到响应器链中,所以我将其设置nextResponder为窗口控制器; 没有雪茄.我究竟做错了什么?
我很惊讶地发现以下行为......
@interface Foo : NSObject
- (void)addBar:(id)aBar withCompletion:(void(^)(void))completion;
@end
@interface AwesomeClass : NSObject
@property (strong, nonatomic) Foo *foo;
- (void)doSomethingWithBar:(id)bar;
@end
@implementation AwesomeClass
- (void)doSomethingWithBar:(id)bar
{
[self.foo addBar:bar withCompletion:^{
NSLog(@"%@", self.foo);
}];
}
Run Code Online (Sandbox Code Playgroud)
在Xcode 4.6.1中,我在实现中得到警告-doSomethingWithBar:,"在这个块中强烈捕获'自我'可能会导致保留周期."
但是,如果我重构名称的方法-addBar:withCompletion:来-setupBar:withCompletion:此警告消失.看来我的惊喜表明我对Objective-C命名约定的知识存在差距!
我想枚举Haskell中文件夹的所有子文件夹.获取所有文件夹内容很简单,有一个 getDirectoryContents功能.但是我该如何过滤它们呢?由于getDirectoryContents返回a IO [FilePath]和filter期望[a],我不能将这两者直接放在一起.(显然,我是一条带有monad和do-notation的新鲜鱼.)
getAllFolders :: FilePath -> IO [FilePath]
getAllFolder path = do
allItems <- getDirectoryContents path
-- now what? the predicate is doesDirectoryExist
Run Code Online (Sandbox Code Playgroud) 我知道我可以打开安全和隐私偏好设置面板,如下所示:
open /System/Library/PreferencePanes/Security.prefPane
Run Code Online (Sandbox Code Playgroud)
是否可以以编程方式导航到"隐私"选项卡?我想让用户轻松找到合适的屏幕.请注意,此时禁用了辅助功能API,这就是我要在"隐私"选项卡上启用的功能.(这是10.9中的新功能.)
我正在Swift中尝试基于消息的架构.我正在尝试做类似于Elm Architecture的事情.这是我的代码的样子:
enum SideEffect<Message> {
case sendRequest((String) -> Message)
}
protocol Component {
associatedtype Message
mutating func send(msg: Message) -> [SideEffect<Message>]
}
struct State: Component {
var something: String?
enum Message {
case downloadSomething
case receiveResponse(String)
}
mutating func send(msg: Message) -> [SideEffect<Message>] {
switch msg {
case .downloadSomething:
return [.sendRequest(Message.receiveResponse)]
case .receiveResponse(let response):
something = response
return []
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以状态是建模的State,你可以通过发送Messages 来改变它.如果有任何副作用要计算,它们将作为SideEffect消息返回,并由其他人处理.每条SideEffect消息都带有一个"回调"参数,a Message在副作用结束时发送.这非常有效.
现在,如果我想要一个通用的副作用消息怎么办?我想要这样的东西:
struct Request<ReturnType> { … } …Run Code Online (Sandbox Code Playgroud) 我有一个带有一组值的JSON:
[
{ "tag": "Foo", … },
{ "tag": "Bar", … },
{ "tag": "Baz", … },
]
Run Code Online (Sandbox Code Playgroud)
我想将这个数组解码为一个structs 数组,其中特定类型取决于标记:
protocol SomeCommonType {}
struct Foo: Decodable, SomeCommonType { … }
struct Bar: Decodable, SomeCommonType { … }
struct Baz: Decodable, SomeCommonType { … }
let values = try JSONDecoder().decode([SomeCommonType].self, from: …)
Run Code Online (Sandbox Code Playgroud)
我怎么做?目前我有这个有点丑陋的包装:
struct DecodingWrapper: Decodable {
let value: SomeCommonType
public init(from decoder: Decoder) throws {
let c = try decoder.singleValueContainer()
if let decoded = try? c.decode(Foo.self) {
value …Run Code Online (Sandbox Code Playgroud) 看起来协议中不允许使用弱引用.那么,如果我想添加一个弱引用,我该怎么办呢?有什么好主意吗?
protocol PipelineElementDelegate: class {
func someFunc()
}
protocol PipelineElement {
weak var delegate: PipelineElementDelegate? { get set}
}
Run Code Online (Sandbox Code Playgroud) 我找到了这个教程,这很好,但对我不起作用!
这是代码:
- (void)listenForBlow:(NSTimer *)timer {
[recorder updateMeters];
const double ALPHA = 0.05;
double peakPowerForChannel = pow(10, (0.05 * [recorder peakPowerForChannel:0]));
lowPassResults = ALPHA * peakPowerForChannel + (1.0 - ALPHA) * lowPassResults;
if (lowPassResults > 0.95)
NSLog(@"Mic blow detected");
//change the background color e.g !
}
Run Code Online (Sandbox Code Playgroud)
在控制台中向我展示这样的nslog研究(没有任何保龄球!):
2010-04-11 23:32:27.935 MicBlow[2358:207] Mic blow detected
2010-04-11 23:32:27.965 MicBlow[2358:207] Mic blow detected
2010-04-11 23:32:27.995 MicBlow[2358:207] Mic blow detected
2010-04-11 23:32:28.026 MicBlow[2358:207] Mic blow detected
2010-04-11 23:32:28.055 MicBlow[2358:207] Mic blow detected
2010-04-11 …Run Code Online (Sandbox Code Playgroud) swift ×3
iphone ×2
macos ×2
objective-c ×2
clang ×1
cocoa ×1
codable ×1
elm ×1
frameworks ×1
generics ×1
haskell ×1
io ×1
ios ×1
ipad ×1
json ×1
microphone ×1
monads ×1
nsmenuitem ×1
nsresponder ×1
protocols ×1
xcode ×1