我一直在使用Swift for iOS中的约束,并且大多数命名约定/文档使事情变得非常自我解释,但最近让我困惑的一件事是两对NSLayoutXAxisAnchor类:
leadingAnchor, leftAnchor
Run Code Online (Sandbox Code Playgroud)
随着
trailingAnchor, rightAnchor
Run Code Online (Sandbox Code Playgroud)
当我在iOS应用程序中以编程方式设置约束时,我发现我可以完全互换使用这些约束.如果我使用leadingAnchor,运行app并观察行为,然后使用leftAnchor,运行app并观察行为,它的功能完全相同.
我查看了developer.apple.com的文档,结果甚至完全相同(忽略了名称的不同).例如,比较leadingAnchor和leftAnchor:
"使用此锚点创建具有视图前沿的约束.您只能将此锚点与NSLayoutXAxisAnchor锚点的子集组合.您可以将leadingAnchor与另一个leadingAnchor,trailingAnchor或centerXAnchor组合.有关更多信息,请参阅NSLayoutAnchor类参考."
相比于:
"使用此锚点创建视图左边缘的约束.您只能将此锚点与NSLayoutXAxisAnchor锚点的子集组合.您可以将leftAnchor与另一个leftAnchor,rightAnchor或centerXAnchor组合.有关更多信息,请参阅NSLayoutAnchor类参考."
有谁知道这些属性之间是否存在任何预期的差异?
最近,我一直在使用Swift开发多个面向协议的应用程序框架,并注意到协议扩展中有一些(看似)奇怪的静态函数行为,特别是从元类型调用扩展函数的情况.
我最初发现这些行为的方式是对一个错误进行故障排除,其中一个对象的类型以一种看似不可能的方式发生了变化.我追查了问题并最终确定这是因为在静态函数中,Self并且self可能存在不同的类型(注意:我已经分别称这些为"Big S Self"和"Little s self").我将用我在游乐场中掀起的一些简单的例子来证明这一点:
class SomeBaseClass: SomeProtocol {}
class SomeChildClass: SomeBaseClass {}
protocol SomeProtocol {}
extension SomeProtocol {
static private func getName() -> String {
return "\(self): \(type(of: self))"
}
static func ambiguousName() -> String {
return getName()
}
static func littleName() -> String {
return self.getName()
}
static func bigName() -> String {
return Self.getName()
}
}
let child: SomeBaseClass.Type = SomeChildClass.self // SomeChildClass.Type
print(child.ambiguousName()) // "SomeChildClass: SomeBaseClass.Type\n"
print(child.littleName()) // "SomeChildClass: SomeBaseClass.Type\n"
print(child.bigName()) …Run Code Online (Sandbox Code Playgroud) 在 Django 和 Google App Engine 方面,我有点菜鸟,我在应用程序设置中设置项目路径时遇到问题。具体来说,我试图引用一个 CSS 文件以与模板一起使用。我的目录结构如下:
app/
app/
-'__init__'.py
-settings.py
-urls.py
-views.py
-wsgi.py
img/
static/
css/
-style.css
templates/
-index.html
Run Code Online (Sandbox Code Playgroud)
我认为我的问题在于基于我过去几个小时所做工作的设置。我开始无法引用模板,但我想出了如何做到这一点,让我解释一下:
在 settings.py 中,我有以下有关模板的信息:
PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))
TEMPLATE_DIRS = (
PROJECT_PATH + '/templates',
)
Run Code Online (Sandbox Code Playgroud)
结果证明这很简单。我设置了一个 PROJECT_PATH 来保存项目的路径,并附加了模板目录。但是,我仍然无法为静态文件做同样的事情,这就是我迷失的地方。关于静态文件,我在设置中有以下内容:
PROJECT_PATH = os.path.abspath(os.path.dirname(__name__))
STATIC_ROOT = ''
STATIC_URL = '/static/'
STATICFILES_DIRS = (
PROJECT_PATH + '/static',
)
Run Code Online (Sandbox Code Playgroud)
从理论上讲,只要我使用的目录名为“/static/”,这些默认值就可以正常工作,但它的工作方式与模板不同。我尝试了很多不同的方法来尝试让这些值指向正确的目录,但只有一次我真正成功了,我认为这是使用绝对路径的组合,即“用户/用户名/应用程序” /static/css/' 一旦我部署项目就没有意义,因为我没有在我的计算机上托管它。另外我可能已经将静态目录移动到 app 子文件夹中,这也应该是不必要的。与模板文件相比,静态文件有什么不同?为什么我可以使用 PROJECT_PATH 并附加“/static”来实现与模板相同的结果?
我的项目中的其他一些有用信息:
app/urls.py:
urlpatterns = patterns(
'',
url(r'^$', views.index, name='index'),
) + staticfiles_urlpatterns()
Run Code Online (Sandbox Code Playgroud)
和:
templates/index.html:
<html>
<head>
{% load …Run Code Online (Sandbox Code Playgroud) 泛型方法是否有可能根据其执行的类来推断其类型?我使用CoreData NSManagedObject模型来存储和检索本地数据,并设法以易于阅读和可用的方式使一切通用,除了在一个地方.如果用户希望查询本地数据库以获取对象列表,他将编写以下行:
let posts: [Post] = Post.all()
Run Code Online (Sandbox Code Playgroud)
这将正确返回数据库中的"all"Post对象,但语法要求[Post]在Post类本身(Post.all())调用方法之前定义类型(),这会感觉不必要地多余.有没有办法只通过all()从Post类中调用方法来定义泛型类型?我想我可以创建用于获取数据的全局函数,如下所示:
let posts: [Post] = all()
Run Code Online (Sandbox Code Playgroud)
如果语法如下,这种感觉几乎不可读:
let posts = Post.all()
Run Code Online (Sandbox Code Playgroud)
尝试改进这一点的重点是,任何接受这个项目的开发人员都可以快速学习结构和风格而不需要太多努力.此外,这将有望在将来增加一般代码的可读性,无论是否有人正在处理它或只是出于其他原因阅读它.
有关更多信息,请参阅以下有关当前结构的更多信息:
//Model.swift - The model base class. All models extend this class.
class Model: NSManagedObject {
/**
Some other stuff here
**/
//MARK: Fetch
internal class func fetch<T: Model>(predicate: NSPredicate? = nil) -> [T]? {
do {
if let request = NSFetchRequest.FromEntityName(self.entityName) { //Get entity with the name defined in the …Run Code Online (Sandbox Code Playgroud)